SSE(Server-Sent Events,服务器推送事件)是一种用于实现服务器和客户端之间实时通信的技术。相比于其他技术,SSE 具有以下优势:
- 基于 HTTP 协议,不需要使用 WebSocket、WebRTC 等新的协议,可以更容易集成入现有的系统中。
- 对于单向实时通信,SSE 比长轮询更高效,相比轮询机制减少了不必要的网络请求。
- SSE 简单易用,不需要像 WebSocket 一样进行复杂的握手协议等操作。
由于 SSE 技术相对较新,许多开发者在实际开发中会遇到各种问题。本文将介绍 SSE 的最佳实践,并提供实用的代码示例。
用法
SSE 的用法非常简单。客户端通过 EventSource
对象与服务器建立连接,服务器不断发送事件消息。客户端收到消息后,可以进行相应的处理。
服务端代码示例
以下是一个基于 Node.js 平台的 SSE 服务端代码示例:
const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', }); setInterval(() => { res.write(`data: ${new Date()}\n\n`); }, 1000); }); server.listen(3000);
上述代码创建了一个简单的 HTTP 服务器,每秒钟向客户端发送一条消息,消息内容为当前时间。其中的 'Content-Type': 'text/event-stream'
表示返回的是 SSE 格式的数据。
客户端代码示例
以下是一个基于 jQuery 的 SSE 客户端代码示例:
const source = new EventSource('/sse'); source.onmessage = function(event) { console.log(event.data); };
上述代码向 /sse
地址发起 SSE 连接,当服务端发送消息时,source.onmessage
事件将被触发,控制台将输出消息的内容。
最佳实践
控制发送频率
由于 SSE 会不断地向客户端发送消息,如果发送频率过高,会导致网络拥堵,甚至无法打开连接。在实际应用中,我们需要根据实际情况控制发送频率。可以考虑使用以下两种方法:
- 在服务端控制消息发送的时间间隔。
- 在客户端控制消息的接收速率:仅在必要时打开连接,并设置一个合理的
retry
时间,使客户端可以在一定的时间间隔内请求到最新的消息。
const source = new EventSource('/sse'); let canOpen = true; source.onopen = function(event) { if (!canOpen) { setTimeout(() => source.close(), 1000); } canOpen = false; }; source.onmessage = function(event) { console.log(event.data); canOpen = true; }; source.onerror = function(event) { console.error(event); canOpen = true; };
上述代码实现了向服务器请求最新消息的逻辑。如果当前连接已打开,不会继续打开连接,而是等待服务器推送消息。当客户端接收到第一条消息后,重新打开连接。
使用心跳机制
由于 SSE 只能进行单向通信,客户端无法主动发送消息给服务器,因此需要借助心跳机制来保持连接。心跳机制可以确保客户端在长时间没有数据传输时仍然能保持连接。
const source = new EventSource('/sse'); let timerId = null; source.onopen = function(event) { if (!timerId) { timerId = setInterval(() => source.dispatchEvent(new Event('ping')), 1000); } }; source.onmessage = function(event) { console.log(event.data); }; source.addEventListener('ping', function() { console.log('ping'); });
上述代码使用每秒一次的时间间隔向服务器发送一个 ping
事件,如果服务器在一定的时间(例如 5 秒)内没有响应,则表示连接已断开。此时客户端需要重新建立连接。
使用其他协议
虽然 SSE 可以满足许多实时通信的需求,但在某些情况下,WebSocket 等其他通信协议可能更加适用。在实际应用中,我们需要根据实际情况选择合适的协议。
总结
SSE 是一种全新的实时通信技术,相比于其他通信协议具有更高的可用性和易用性。在实际应用中,我们需要注意控制发送频率、使用心跳机制以及考虑是否使用其他通信协议等问题。通过合理的使用 SSE 技术,我们可以为用户提供更好的体验和更高的工作效率。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a4afb2add4f0e0ffd01b3d