简介
在实时生产数据注入中,常用的方法是通过 WebSocket 来进行数据传输。但是在某些场景下,如简单的页面通知、提醒、状态改变等,我们可能并不需要双向通信,只需要服务器主动向客户端发送数据即可。这种情况下,使用 Server-Sent Events(简称 SSE)就显得更为合适。
SSE 是 HTML5 提供的一种服务器到客户端单向消息推送技术,与 WebSocket 不同,SSE 可以利用静态HTTP连接进行单向通信,相比 WebSocket 更加轻量化和简单实现,适用于一些高延迟、低带宽场景下的数据传递。
本文将介绍如何使用 SSE 实现实时生产数据注入,包括 SSE 的基本概念、使用过程中的注意事项以及服务器和客户端的示例代码。
SSE 基本概念
SSE 对象
SSE 对象表示打开的服务器连接,客户端使用 SSE 对象来接收服务器数据。可以使用如下代码创建 SSE 对象:
const eventSource = new EventSource(url);
其中 url 是服务器端生成事件流的地址。在使用 SSE 时,服务器端需要指定 MIME 类型为 text/event-stream,而且在发送的数据中每条消息前必须加上 "event:xxx","data:xxx","id:xxx" 这三种消息类型(冒号后的为内容),用于告知客户端消息类型以及要发送的数据。
SSE 事件
SSE 事件就是服务器端推送给客户端的数据,一组 SSE 事件通常结构如下:
// www.javascriptcn.com code example data: 第一条消息 data: 第二条消息 event: event-1 data: 第三条消息 id: 12345 data: 第四条消息 event: event-2 data: 第五条消息 id: 67890
这组消息中一共有两个事件(event-1 和 event-2),每个事件包含多条消息。其中 event: 后面跟着的是事件名,id: 后面跟着的是消息 ID,可以用于在客户端实现消息去重等功能。
SSE 事件采用纯文本格式传输,避免了 JSON 等格式解析的开销,通常数据传输效率更高。
使用 SSE 实现实时生产数据注入
服务器端实现
在服务器端,我们需要创建一个 HTTP 连接,以推送实时数据流到客户端,代码如下:
// www.javascriptcn.com code example
// 配置相应头信息
const headers = {
'Content-Type': 'text/event-stream;charset=UTF-8',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
};
// 创建 HTTP 连接
const server = http.createServer((req, res) => {
// 指定 MIME 类型为 text/event-stream
res.writeHead(200, headers);
// 定期发送事件流
setInterval(() => {
const data = `data: ${Math.random()}\n\n`; // 生成随机数据
res.write(data); // 发送数据
}, 1000);
});
server.listen(3000, () => console.log('Server is running on port 3000.'));这个例子生成了一些随机数据,并以 1 秒钟的间隔进行推送,时间间隔可以根据需要自行调整。在创建 HTTP 连接后,我们需要设置响应头信息,包括 MIME 类型等。随后,将随机数据作为普通文本写入到连接中并发送。
客户端实现
在客户端,我们可以通过如下代码连接到服务器:
const eventSource = new EventSource('http://localhost:3000');
eventSource.onmessage = e => console.log(e.data);其中,EventSource 对象用于建立服务器连接,onmessage 事件用于接收服务器推送的消息。每当接收到服务器推送的消息时,都会执行 console.log(e.data) 操作,将消息输出到控制台。
如果想在客户端实现事件监听,可以这样写:
const eventSource = new EventSource('http://localhost:3000');
eventSource.addEventListener('event-1', e => console.log(e.data));
eventSource.addEventListener('event-2', e => console.log(e.data));这样,就对事件流中的不同事件进行了监听,当检测到 event-1 事件时,会执行 console.log(e.data) 操作并输出相应的数据。
注意事项
- SSE 是一种长链接技术,存在长时间占用连接资源的风险。因此,在使用 SSE 时必须小心谨慎,注意连接是否合理。
- SSE 只能应用于长链接,不适用于短链接。换言之,使用 SSE 传输文件或图片等大文件不合适。
- SSE 不是一种双向通信技术,只能服务器向客户端推送消息,不能进行反向通信。
- 不同浏览器对 SSE 实现不太一致,需要根据具体情况选择合适的实现方式。
结语
本文介绍了如何使用 SSE 实现实时生产数据注入,并对 SSE 的基本概念进行了解释,同时提供了服务器端和客户端的示例代码。如果你需要在实时数据注入场景下处理高延迟、低带宽、高并发等问题,那么使用 SSE 将是一个非常好的选择。
将来,随着 HTML5 技术在 Web 应用中的普及,SSE 技术将会得到更广泛的应用和推广,为企业提供更好的实时通讯和数据交互体验。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cfdcf9e46428fe9ec0ccaa