问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SSE(Server-Sent Events)功能介绍与使用方式

创作时间:
作者:
@小白创作中心

SSE(Server-Sent Events)功能介绍与使用方式

引用
CSDN
1.
https://blog.csdn.net/qq_36955155/article/details/138335559

SSE(Server-Sent Events)是一种服务器推送技术,这种技术基于HTTP协议,利用HTTP的长连接特性,在客户端与服务器之间建立持久化连接,并通过该连接实现服务器向客户端的实时数据推送(应用于当前市面上的聊天语言模型,比如文心一言、chatgpt等)。SSE建立了一个从服务器到客户端的单向通道,服务器通过这个通道可以持续地向客户端发送事件流,而无需客户端进行显式的请求。服务器发送的事件流是由一系列的事件组成的,每个事件都以特定的格式呈现包含一个或多个字段,如事件的名称、数据内容和可选的ID。

SSE主要关注的是服务器与客户端之间的通信协议和机制,它定义了一个标准,不同的服务器和客户端有不同的实现方式。

客户端:

SSE的实现主要通过JavaScript的EventSource接口来完成。几乎所有的现代浏览器都支持EventSource接口,这使得SSE具有广泛的兼容性。客户端通过创建EventSource对象并指定服务器发送事件的URL来建立与服务器的连接。一旦连接建立,服务器就可以通过该连接向客户端发送实时更新。

但是,标准的
EventSource
API不支持POST请求和发送请求参数

EventSource
只支持通过GET方法连接到服务器,并且它不支持在连接时发送额外的请求头或请求体。这是因为SSE协议是基于HTTP的,而HTTP的服务器发送事件(Server-Sent Events)通常是通过GET请求建立的长期连接。可以使用sse.js,它是将
EventSource
进行封装,可以支持POST请求和发送请求参数
,具体的使用方式可以看官网,官网链接:https://github.com/EventSource/eventsource

sse.js的使用示例:

const EventSource = require('eventsource');

const es = new EventSource('https://example.com/sse', {
  headers: {
    'Authorization': 'Bearer YOUR_TOKEN'
  }
});

es.addEventListener('message', function(event) {
  console.log(event.data);
});

es.addEventListener('error', function(event) {
  console.error(event);
});

服务端:

开发人员可以使用各种编程语言和技术栈来实现SSE,这里主要讲Java开发人员如何实现SSE。

1.SseEmitter

使用SseEmitter来发送SSE事件,但是需要创建新线程来模拟异步发送SSE事件,推荐使用线程池,配置了线程池来发送SSE通常不会直接导致调用线程被阻塞,但这并不意味着整个过程中完全不存在阻塞操作的风险,所以更推荐的做法是使用WebFlux的响应式编程模型来直接发送SSE。

2.Spring WebFlux

使用
Flux
来发送SSE事件,可以更直接地利用WebFlux的异步和响应式特性。


© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号