如何使用 Server-sent Events 实现定期数据推送

阅读时长 4 分钟读完

在前端开发中,我们经常需要实现实时数据的推送。虽然现在 WebSocket 已经成为了实时通信的主流技术,但是如果只需要服务端发送数据而不需要前端发送数据的话,我们可以使用 Server-sent Events (SSE) 技术。

什么是 Server-sent Events?

Server-sent Events 是一种 HTML5 的新特性,它允许服务端发送事件给客户端,而客户端通过 EventSource 对象来监听事件并处理。与 WebSocket 不同的是,SSE 是基于 HTTP 协议的,也就是说,我们并不需要使用特殊的协议和端口来进行通信,它和普通的 HTTP 请求一样,可以通过 HTTP/HTTPS 协议进行通信。

SSE 的工作原理是,客户端向服务端发送一个 HTTP 请求,服务端会保持连接打开不关闭,然后定期发送数据给客户端。当客户端接收到数据时,随时可以通过 message 事件处理函数来处理收到的数据。

如何使用 Server-sent Events?

使用 SSE 自然需要服务端的支持,下面我将以 Node.js 为例,讲解如何使用 SSE 实现数据推送。

准备工作

首先我们需要安装一个 Node.js 的 package,名为 express,它是一个基于 Node.js 的 Web 应用开发框架,提供了一套完整的 MVC 架构。在安装之前我们需要先安装 npm,安装完毕后,执行 npm install express 安装 express

服务端代码

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

-- --------
-----------------------------------

-- ----
--------------- ----- ---- -- -
  -- -- -------
  ----------------------------- ---------------------
  ------------------------------ ------------
  --------------------------- --------------
  -------------------

  -- ----------
  -------------- -- -
    -- ----
    ---------------- ----- -------------------------------
  -- ------
---

-- -----
---------------- -- -- ------------------- ------------

首先我们通过 require 引入 express,然后创建一个 express() 实例 app。接着我们设置静态文件目录,这里我设置为当前目录,所以将 __dirname 传入 express.static() 方法即可。

然后我们使用 app.get() 方法设置了路由 /sse。在这个路由中,我们首先在响应头部添加了一些 SSE 规定的特殊的 HTTP 头部,用于告诉浏览器对响应进行特殊处理,同时为了保持连接的打开,我们使用 res.flushHeaders() 方法。然后,我们通过 setInterval 方法定时向客户端发送数据,这里我设置的是每秒发送一次数据,具体的发送内容可以自己定义,最后将数据通过 write() 方法写入响应体。需要注意的是,每条数据需要以 \n\n 结尾。

最后我们使用 app.listen() 方法启动服务器,监听在本地 3000 端口,打印 "Server Start..." 字符串表示服务器已经启动。

客户端代码

在客户端中,我们首先创建了一个 EventSource 对象,将请求地址设置为我们在服务器中设置的 /sse 路由。然后,我们在 onmessage 事件处理程序中,处理从服务器端发送来的数据。

在这个例子中,每次从服务器端发送来的数据都会被打印到控制台,你也可以根据自己的需要,对数据进行其他处理。

总结

使用 Server-sent Events 实现定期数据推送,是一种简单且高效的方案,适用于无需实时双向通信的场景。在 Node.js 中,我们可以使用 express 框架来实现 SSE。在客户端,我们可以使用 EventSource 对象来监听事件并处理。

希望这篇文章对你有所帮助,也希望你能够掌握使用 SSE 实现数据推送的技能。

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

纠错
反馈