什么是服务器端推送?
服务器端推送(Server-Sent Events,SSE)是一种用于在 Web 应用程序中实现服务器推送的技术。它允许服务器向客户端持续发送事件,而不需要客户端发起请求。这种技术可以用于实时聊天,股票报价更新,实时互动和其他需要实时性和快速响应的应用程序场景。基于浏览器对 SSE 的支持,相对于 WebSocket 而言,更简单,可靠,易于实现。
如何使用 SSE?
SSE 的基本用法
使用 SSE 的基本要素包括:
- 一个可以发送 SSE 事件的服务器端
- 一个可以接收 SSE 事件的客户端
- 一系列 SSE 事件
SSE 事件包括一个事件标识符(event identifier)、用于描述事件内容的数据(data),以及一些可选的元数据字段(只读,键值对形式,如 comment 和 retry)。数据字段可以是任何有效的文本格式(例如 HTML、XML、JSON 等)。
-- -------------------- ---- ------- ---- --- -------- ----------- ---- --- -- --- --------- ----- ------ ------ ---- ------------------ -------- ----- ----------- - --- ------------------------------------------ --------------------- - ----- -- - ----- ---- - ----------- ------------------------------------------- -- ---- - ------- - --------- ------- -------
-- -------------------- ---- ------- - --- --------- ----- - ---- ----- ------ ------ -------- --- - --------------- --------------------------- --- --------------- --- --------- ----- ----- ------- - ---------------------- - -- --- ---- ----- ------- -------------- - -- --- -- ------ ------------------ -----------------------------
SSE 事件类型
SSE 事件类型包括:
- message:通用类型
- event:自定义类型
- retry:重连时间时间(单位为毫秒)
SSE 事件可以通过一个可选的特殊头部 X-Accel-Buffering 来指示是否缓冲发送事件,如果该头部是 no,那么 events 将立即被发送,不会被缓冲。
SSE 连接状态
使用 SSE,客户端会维护与服务器的一个长期连接。因此,需要了解 SSE 连接状态以及如何处理 SSE 连接出现的问题。
SSE 连接可能出现以下状态:
- CONNECTING:客户端正在尝试建立连接。
- OPEN:连接正常,可以收到 SSE 事件。
- CLOSED:连接已关闭。
关闭连接可以在任何一侧完成,客户端可以通过调用 close() 方法来关闭 SSE 连接。
eventSource.readyState
属性可以用于查询 SSE 连接当前状态。
// 进入连接中状态 eventSource.readyState === EventSource.CONNECTING // 连接成功进入连接状态 eventSource.readyState === EventSource.OPEN // 连接关闭进入关闭状态 eventSource.readyState === EventSource.CLOSED
SSE 服务端语言和框架
实现 SSE 的服务器端语言和框架很多,其中比较流行的有:
- Node.js,使用了
EventSource
对象来实现客户端 SSE 连接。 - Flask-SSE,一个基于 Flask 的 SSE 扩展,提供了路由,事件注册和回调等功能。
- Go-SSE,一个基于 Go 的 SSE 库,支持绑定多个事件处理器。
- Ruby on Rails,通过 ActionCable 实现 SSE 支持。
和客户端一样,服务器端的 SSE 事件也可以使用自定义格式(例如 JSON)。
SSE 和 WebSocket 的对比
WebSocket 是另一种用于实现服务器推送的技术。相对于 SSE,WebSocket 更为强大,可靠,可扩展。但是 SSE 比 WebSocket 更加轻量,更简单易用。
- SSE 适用于只需要从服务器单向发送数据的场景
- WebSocket 适用于大量双向交互的场景
在选择 SSE 还是 WebSocket 的时候,应该根据业务需求进行选择。
总结
SSE 是一种相对简单、可靠的服务器推送技术,适用于需要实时提供数据的场景。在使用 SSE 的时候,需要了解 SSE 事件类型、连接状态以及 SSE 服务端语言和框架的选择,这样才能更好地应用 SSE。选择 SSE 还是 WebSocket,应该根据具体业务需求进行选择。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64eb28b9f6b2d6eab35cf09c