当前位置: 首页 > news >正文

hyperlane使用SSE实现服务端主动推送

GITHUB 地址

hyperlane 框架支持 SSE,服务端主动推送,下面是每隔 1s 完成一次推送,并在 10 次后关闭连接

SSE 规范: 服务器使用 “Content-Type: text/event-stream” 表示响应是一个 SSE 事件流。
接着使用 “data” 字段来发送事件数据,每个事件以 “data:” 开头,后面跟着事件的内容和一个空行。
客户端收到这样的响应后,就可以解析其中的事件数据并进行相应的处理。

服务端代码

use crate::{tokio::time::sleep, *};
use std::time::Duration;

pub async fn root(controller_data: ControllerData) {
    let _ = controller_data
        .set_response_header(CONTENT_TYPE, TEXT_EVENT_STREAM)
        .await
        .send_response(200, "")
        .await;
    for i in 0..10 {
        let _ = controller_data
            .send_response_body(format!("data:{}{}", i, HTTP_DOUBLE_BR))
            .await;
        sleep(Duration::from_secs(1)).await;
    }
    let _ = controller_data.close().await;
}

客户端代码

客户端代码

断线重连
const eventSource = new EventSource('http://127.0.0.1:60000');

eventSource.onopen = function (event) {
  console.log('Connection opened.');
};

eventSource.onmessage = function (event) {
  const eventData = JSON.parse(event.data);
  console.log('Received event data:', eventData);
};

eventSource.onerror = function (event) {
  if (event.eventPhase === EventSource.CLOSED) {
    console.log('Connection was closed.');
  } else {
    console.error('Error occurred:', event);
  }
};
取消断线重连
const eventSource = new EventSource('http://127.0.0.1:60000');

eventSource.onopen = function (event) {
  console.log('Connection opened.');
};

eventSource.onmessage = function (event) {
  const eventData = JSON.parse(event.data);
  console.log('Received event data:', eventData);
};

eventSource.onerror = function (event) {
  if (event.eventPhase === EventSource.CLOSED) {
    console.log('Connection was closed.');
    // 关闭连接,防止自动重连
    eventSource.close();
  } else {
    console.error('Error occurred:', event);
  }
};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/57849.html

相关文章:

  • 【0013】Python数据类型-列表类型详解
  • 详解常用集合和映射中的线程安全问题
  • 练习题:74
  • svn删除所有隐藏.svn文件,文件夹脱离svn控制
  • 第九章:把函数当变量传递,匿名函数、闭包、panic/recover
  • 背包九讲
  • 全自动数据强制备份程序,无视占用直接硬复制各种数据文件、文档、音视频、软件、数据库等的VSS卷拷贝批处理脚本程序,解放双手,一劳永逸
  • el-table一格两行;概率;find
  • 每日一题——搜索二维矩阵
  • 动态规划--斐波那契类型
  • Java基础系列:深入解析包装器类型与类型转换的奥秘与陷阱
  • C#类型转换基本概念
  • 数据结构链表的C++实现
  • 【网络编程】同步和异步、阻塞和非阻塞,I/O和网络I/O
  • 基于Matlab的人脸识别的二维PCA
  • 3.8[a]cv
  • MySQL 面试篇
  • 静态时序分析STA——2. 数字单元库-(1)
  • Uniapp 页面返回不刷新?两种方法防止 onShow 触发多次请求!
  • 网络通信Socket中多态HandleIO设计模式深度解析
  • Hive八股
  • 计算机毕业设计SpringBoot+Vue.js社区医疗综合服务平台(源码+文档+PPT+讲解)
  • 一周热点-文本生成中的扩散模型- Mercury Coder
  • 最小栈 _ _
  • set、LinkedHashSet和TreeSet的区别、Map接口常见方法、Collections 工具类使用
  • 03.08
  • 动态 SQL 的使用
  • Spark八股
  • 基于 Next.js(前端)和 FastAPI(后端)使用 WebSocket(满血版DeepSeek-R1回答)
  • 计算机组成原理