什么是 Server-sent Events
Server-sent Events(简称 SSE)是一种基于 HTTP 的服务器推送技术,它允许服务器向客户端推送数据,而无需客户端发起请求。SSE 通过一个持久化的 HTTP 连接,将服务器端的事件流实时地推送到客户端,从而实现了实时的双向通信。
SSE 的特点是:
- 简单易用,只需要使用浏览器内置的 EventSource 对象即可
- 支持跨域访问,不需要像 WebSocket 那样进行握手等复杂的操作
- 可以自定义事件类型和数据格式
- 支持断线重连,可以自动恢复连接
SSE 的使用场景
SSE 可以用于实现各种实时通知和推送功能,比如:
- 实时聊天室
- 股票行情实时更新
- 天气预报实时推送
- 服务器端日志实时推送
SSE 的优点是它可以使用标准的 HTTP 服务器,不需要特殊的服务器软件或插件,因此可以方便地集成到现有的 Web 应用中。
SSE 的限制
SSE 的主要限制是它只能使用 HTTP 协议,因此它不能像 WebSocket 那样支持二进制数据和其他自定义协议。此外,SSE 的消息传输是单向的,只能由服务器端向客户端发送数据,无法实现客户端向服务器端发送数据。
SSE 的另一个限制是它只能使用长连接,因此它会占用服务器端的连接资源。如果连接数过多,可能会导致服务器负载过高。为了避免这种情况,可以使用负载均衡技术,将连接均衡分配到多个服务器上。
SSE 的示例代码
下面是一个简单的 SSE 示例代码,它使用 Node.js 的 http 模块创建一个 HTTP 服务器,并使用 SSE 向客户端推送当前时间。
// javascriptcn.com 代码示例 const http = require('http'); 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().toLocaleString()}\n\n`); }, 1000); }).listen(3000); console.log('Server running at http://localhost:3000');
在客户端,可以使用以下代码创建一个 EventSource 对象,并监听服务器端的事件流:
const eventSource = new EventSource('http://localhost:3000'); eventSource.addEventListener('message', event => { console.log(event.data); });
当客户端连接到服务器后,服务器会每秒钟向客户端发送一个包含当前时间的消息。客户端会将消息输出到控制台。由于 SSE 支持断线重连,如果连接断开后重新连接,服务器会自动从上次断开的位置继续发送消息。
总结
Server-sent Events 是一种简单易用的服务器推送技术,它可以用于实现各种实时通知和推送功能。然而,它也有一些限制,比如只能使用 HTTP 协议,只能单向传输数据等。在选择 SSE 还是 WebSocket 时,需要根据具体的业务需求和技术限制进行选择。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/655b2c52d2f5e1655d5584e5