在 Web 应用程序中,我们经常需要推送实时更新到客户端。Server-Sent-Events(缩写为 SSE)提供了一种简单的实现方案。
本文将介绍 Node.js SSE 的实现,涉及 SSE 原理、Node.js 库、服务器端代码和客户端代码示例。
SSE 原理
SSE 是一种消息协议,通过 HTTP 连接发送实时消息。与 WebSocket 不同,SSE 使用 HTTP 连接完全做到了实现方式无需客户端和服务器之间的TCP握手。对于仅需要单向通信的应用程序,SSE 是一个不错的选择。
在 SSE 会话中,客户端通过向服务器发送请求来建立一个持久连接,并保持连接直到达到一定时间或事件。在此期间,服务器可以发送任意数量的消息到客户端。与 Ajax 轮询的优点在于不需要客户端多次打开和关闭连接,可以减少宽带使用和延迟。
在服务端,可以使用 Node.js 的库实现 SSE。下面是一些常见的用于 SSE 连接的包。
- sse-channel
- express-sse
- EventSource:用于客户端的 Web API。
Node.js 库
要实现 SSE 服务器端,需要安装事件源消息的库。这里使用 sse-channel。
npm install sse-channel
sse-channel 可以用于实现多个 SSE 连接和消息频道。需要获取消息的客户端可以注册频道,只有注册的客户端才能接收该频道的消息。下面是一个简单的示例代码可以做到这一点。
// javascriptcn.com 代码示例 // server.js const SSEChannel = require('sse-channel'); const http = require('http'); const channel = new SSEChannel(); http.createServer((req, res) => { if (req.url === '/stream') { res.setHeader('Content-Type', 'text/event-stream'); channel.addClient(req, res); } }).listen(8000); setInterval(() => { channel.send(JSON.stringify({ time: new Date() })); }, 1000);
在这个例子中,SSE 服务器监听在端口 8000 上,服务端每秒钟向频道发布一个 JSON 消息。
client 端可以使用 EventSource 连接到这个 SSE 服务器。
// client.js const source = new EventSource('http://localhost:8000/stream'); source.onmessage = (event) => { console.log(event.data); };
在这个例子中,客户端使用 EventSource 连接 SSE 服务器,当收到消息时,使用 onmessage
事件处理程序来处理消息。
总结
SSE 是一种推送消息协议,通过 HTTP 连接提供实时消息更新。在服务端,我们可以使用 Node.js 的库实现 SSE。在本文中,我们介绍了 sse-channel 库的使用,并提出了服务器端和客户端的示例代码。
SSE 在单向通信应用程序中非常有用,例如新闻源,股票报价,客户处理和其他实时通知。对于需要实时通信的更复杂应用程序,WebSocket 可能是更好的选择。
参考
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653e30307d4982a6eb7c0ec7