SSE event stream

94 阅读2分钟

SSE(Server-Sent Events)是一种允许服务器向浏览器推送实时更新的技术。它提供了一种单向通信机制,其中服务器可以主动发送数据给客户端,而不需要客户端的请求。这与传统的HTTP请求-响应模型不同,在传统模型中,客户端必须先发起请求,服务器才能做出响应。

以下是关于SSE的一些关键点:

1. 协议和格式

SSE使用HTTP协议,但它的消息格式有特定的要求。一个SSE消息通常包含以下字段:

  • data::这是消息的主要内容。如果消息有多行,每一行都以data:开始。
  • event::可选字段,用于指定事件的类型。客户端可以通过监听这个特定类型的事件来处理不同的消息。
  • id::可选字段,为每个事件流定义一个ID。如果连接断开并重新建立,浏览器会将最后一个接收到的ID发送回服务器,以便从断开的地方继续。
  • retry::可选字段,定义了在尝试重新连接之前的等待时间(毫秒)。如果没有设置此字段,默认重试时间为3秒。

2. 建立连接

要建立SSE连接,客户端需要通过JavaScript创建一个新的EventSource对象,并传入服务器端点的URL。例如:

var source = new EventSource('/sse-endpoint');

一旦连接建立,服务器就可以开始发送消息到客户端。

3. 处理消息

客户端可以通过监听器处理来自服务器的消息:

source.onmessage = function(event) {
    console.log('New message:', event.data);
};

// 监听特定事件类型的消息
source.addEventListener('specific-event', function(event) {
    console.log('Received specific event:', event.data);
});

4. 断开连接

当不再需要接收更新时,可以通过调用close()方法关闭EventSource连接:

source.close();

5. 浏览器支持

大多数现代浏览器都支持SSE,但是IE和Edge的旧版本可能不支持。因此,在使用SSE之前检查浏览器兼容性是很重要的。

6. SSE vs WebSocket

虽然两者都可以实现实时通信,但它们有不同的应用场景:

  • SSE:适合于只需要服务器向客户端推送数据的场景。它基于HTTP,易于实现,且对于跨域请求有更好的原生支持。
  • WebSocket:提供了全双工通信通道,允许客户端和服务器之间双向通信。适用于如聊天应用等需要频繁双向通信的应用。

7. 性能考虑

SSE保持一个长时间打开的HTTP连接,这可能会对服务器资源造成压力。因此,确保你的服务器配置能够有效地管理这些长连接是至关重要的。

总之,SSE是一个简单、有效的技术,适用于服务器需要向客户端推送更新的各种场景。