什么是 Server-sent Events?
Server-sent Events (SSE) 是一种基于 HTTP 协议的服务器推送技术,它允许服务器向客户端发送事件流,而无需客户端发起请求。SSE 可以用于实时通知用户关于数据的变化、更新或者其他事件。相比于 WebSocket,SSE 更加轻量级,适合于一些简单的实时通信场景。
SSE 协议的基本结构
SSE 协议的基本结构如下:
event: <event-name> data: <event-data> id: <event-id> retry: <milliseconds> event: <event-name> data: <event-data>
event
:事件名称,可以是任意字符串。如果没有指定事件名称,则默认为message
。data
:事件数据,可以是任意字符串。如果需要发送多个数据,可以使用多个data
字段。id
:事件 ID,可以用于标识事件。如果没有指定事件 ID,则默认为上一个事件的 ID 加 1。retry
:重新连接时间间隔,单位为毫秒。如果连接中断,客户端将在指定的时间间隔后重新连接。
SSE 协议使用纯文本格式,每个字段之间使用 \n
进行分隔,最后以 \n\n
结束。
SSE 协议的实现
服务端实现
在 Node.js 中,可以使用 http
模块创建一个 HTTP 服务器,并使用 EventSource
类向客户端发送 SSE 事件流。
-- -------------------- ---- ------- ----- ---- - ---------------- ----------------------- ---- -- - -- -------- --- ---------- - ------------------ - --------------- -------------------- ---------------- ----------- ------------- ------------- --- -------------- -- - ----- ---- - --- --------------------- ----------------- ----------- -------------- -- ------ - ---- - ------------------- ---------- - ----------------
上面的代码创建了一个 HTTP 服务器,它会向客户端发送当前时间的事件流。当客户端访问 /events
路径时,服务器会返回一个 Content-Type
为 text/event-stream
的响应,并且保持连接。每隔 1 秒钟,服务器会向客户端发送一个 time
事件,事件数据为当前时间的 ISO 字符串。
客户端实现
在浏览器中,可以使用 EventSource
类订阅 SSE 事件流。
const source = new EventSource('/events'); source.addEventListener('time', (event) => { console.log(event.data); });
上面的代码订阅了服务器发送的 time
事件,并在控制台输出事件数据。当客户端与服务器建立连接后,服务器会自动向客户端发送事件流,客户端也会自动接收事件流。
SSE 协议的优缺点
优点
- SSE 协议基于 HTTP 协议,可以使用普通的 HTTP 服务器进行实现,不需要额外的服务器软件。
- SSE 协议使用纯文本格式,比 WebSocket 更加轻量级,适合于一些简单的实时通信场景。
- SSE 协议支持自定义事件名称和事件数据,可以灵活地满足不同的业务需求。
缺点
- SSE 协议只能由服务器向客户端发送事件流,不能由客户端向服务器发送消息。
- SSE 协议使用长连接维持连接,如果连接中断,客户端需要重新连接,可能会影响用户体验。
- SSE 协议不支持二进制数据传输,只能传输文本数据。
总结
本文介绍了 Server-sent Events (SSE) 协议的基本结构和实现方式,以及它的优缺点。SSE 协议是一种轻量级的服务器推送技术,适合于一些简单的实时通信场景。在实际应用中,可以根据业务需求选择合适的实时通信技术。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66086503d10417a2226fb4c3