随着 Web 应用的发展,越来越多的网站需要实时地向客户端推送数据,这时候就需要用到服务器推送技术。在此,我们介绍一种实现数据可靠性保证的服务器推送技术——Server-Sent Events(SSE)。
什么是 SSE
SSE 是一种通过 HTTP 协议实现服务器向客户端推送事件的技术,它允许服务器端推送简单文本消息或复杂的数据格式(如 JSON、XML 等),并能够保证消息的可靠性,即只有在客户端收到某个消息后,才会接收到后续的消息。
SSE 是基于 EventSource API 实现的,支持目前现代浏览器,并且不需要使用额外的插件或框架。
SSE 的实现
SSE 是通过在客户端与服务器端之间建立长连接来实现服务器向客户端推送数据。在客户端,我们可以通过使用 EventSource 实例来接收服务器端发送的数据。EventSource 对象提供了一个 onmessage 事件,当服务器发送消息时,该事件将触发,我们可以在事件处理程序中获取到服务器端发送的数据。
在服务器端,我们需要发送特定格式的数据,以便客户端可以正确地解析。下面是一个示例的 SSE 数据格式:
data: Hello, world! data: {"message": "Hello, world!"} id: cde-123 event: chat-message
其中 data
行包含了服务器发送的数据。如果需要发送的是 JSON 格式的数据,可以在 data
行中以字符串形式将其转换成 JSON。
id
和 event
行是可选的,用于为 server-sent event 命名。SSE 可以带上一个可选的事件名,这样客户端就可以只监听感兴趣的事件。
在接收到 SSE 数据后,客户端会将数据解析成 JavaScript 对象。对于上面的数据格式示例,可以使用如下代码处理 SSE 事件:
const eventSource = new EventSource('/path/to/sse'); eventSource.addEventListener('chat-message', (event) => { const message = event.data; console.log(message); });
这会在客户端建立一个到服务器的 SSE 连接,并在收到名为 chat-message
的 SSE 事件时输出消息内容到控制台。
SSE 的数据可靠性保证措施
SSE 通过 HTTP 协议将数据从服务器发送到客户端,与 WebSockets 不同的是,它不是一个双向的长连接。因此,如果客户端在接收 SSE 时断网或关闭连接,则客户端不会收到后续的消息。
为了保证数据可靠性,SSE 会使用重连机制,当连接断开时,客户端会自动尝试重新连接服务器,如果连接成功,则会重新接收从断开到重新连接期间发送的所有数据。在使用 SSE 时,需要注意以下几点:
- 需要在服务器端实现重连机制,确保客户端可以可靠地接收所有数据。
- 需要设置适当的连接超时时间和缓冲区大小,以避免出现连接超时或数据丢失等问题。
下面是一个实现 SSE 数据可靠性保证的示例:
const express = require('express'); const app = express(); app.get('/events', (req, res) => { // 设置头信息,告诉浏览器返回的是 SSE 数据 res.set('Content-Type', 'text/event-stream'); res.set('Cache-Control', 'no-cache'); // 发送一个 ping 事件,告诉客户端连接已建立 res.write(`event: ping\ndata: ${Date.now()}\n\n`); // 设置重连时间,确保客户端可以重新连接服务器 const intervalId = setInterval(() => { res.write(`event: ping\ndata: ${Date.now()}\nretry: 10000\n\n`); }, 30000); // 当连接断开时关闭定时器 req.on('close', () => { clearInterval(intervalId); }); });
在上述示例中,我们使用 Express 框架来实现服务器端的 SSE,设置了适当的响应头信息,并在连接建立时发送了一个 “ping” 事件告诉客户端连接已建立。我们实现了一个每 30 秒发送一个 ping 事件的定时器,并在连接断开时关闭了定时器。这样客户端就可以通过 SSE 接收到服务器发送的数据,而且数据可靠性得到了保证。
总结
SSE 是一种实现数据可靠性保证的服务器推送技术,它通过 HTTP 协议建立长连接,并通过重连机制保证了数据的可靠性。在使用 SSE 时,需要注意设置适当的连接超时时间和缓冲区大小,并在服务器端实现重连机制。
SSE 拥有一些明显的优点,例如不需要额外的插件或框架,支持现代浏览器,并使用可靠的 HTTP 协议,使得它成为一种高效和可靠的服务器推送技术。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a76620add4f0e0ff07367e