服务端的推送技术实现 ——Server-sent Events

· 约 5 分钟读完

在 Web 开发中,客户端与服务端通信是必不可少的,而推送技术是实现实时消息推送的重要方法之一。本文将介绍一种轻量级的推送技术——Server-sent Events(SSE),并提供相关示例代码和学习指导。

Server-sent Events 简介

Server-sent Events 是一种基于 HTTP 的推送技术,与 WebSocket 的主要区别在于 SSE 只能从服务端向客户端单向推送数据,而 WebSocket 支持双向通信。SSE 是 HTML5 规范的一部分,可以在所有现代浏览器中使用,且不需要引入任何第三方库。

SSE 的工作原理是通过建立一个一直开启的 HTTP 连接,将实时消息从服务端发送到客户端。与 WebSocket 相比,SSE 的优点是可以通过简单的 HTTP GET 请求实现,不需要复杂的握手协议和二进制数据解析,且相对于长轮询(long-polling)等技术,SSE 的连接保持更稳定。

使用 Server-sent Events

使用 SSE 首先需要在服务端设置 HTTP 响应头,包含以下信息:

  • Content-Type:固定为 text/event-stream
  • Cache-Control:固定为 no-cache
  • Connection:固定为 keep-alive

同时,响应内容需要按照以下格式发送:

其中,每个事件由 event 和 data 两个字段组成,分别表示事件类型和事件数据,用冒号分隔。多个事件之间用空行分隔。

客户端可以通过 JavaScript 通过 EventSource 对象监听服务端发送的事件,示例代码如下:

代码中,使用 EventSource 对象与 SSE 服务端建立长连接,通过 addEventListener 方法监听 message 事件,并在回调函数中处理收到的消息。

SSE 实现示例

以下代码是一个简单的 SSE 服务端实现和客户端使用示例:

服务端代码:

代码中,如果客户端发送的 URL 是 /sse,服务端会向客户端每隔 1 秒钟发送一个数据事件,类型为 server-time,数据为当前时间。对于其他 URL,服务端返回一个能够接收 SSE 数据的 HTML 页面。

客户端代码:

代码中,客户端使用 EventSource 对象向服务端建立长连接,并监听事件类型为 server-time 的数据事件,收到数据后更新页面中的时间显示。

结语

Server-sent Events 是一种轻量级且易于使用的推送技术,适合实现一些简单的实时推送需求,比如展示实时在线用户数量、新闻评论等。本文提供了相关的使用方法和示例代码,希望对前端开发者有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d680aaa941bf7134c49f9d