Node.js Server-Sent Events(SSE) 基础教程

阅读时长 5 分钟读完

Server-Sent Events(SSE),是HTML5的一项API,它允许我们使用标准的HTTP连接,在服务器和客户端之间实现类似WebSocket的实时双向通讯。不同的是,SSE是一种单向的通讯方式,主要用于服务器向客户端推送数据。

SSE的好处是可以避免客户端不必要的轮询请求,提高数据传输的效率和响应速度。同时,SSE的实现也比较简单,只需要前端程序员精通JavaScript,后端程序员精通Node.js即可。

SSE实现的基本原理

SSE 的基本原理是客户端通过EventSource对象创建一个HTTP请求,服务器返回一个可以一直保持打开的HTTP连接,在服务器端可以实时推送消息,即向客户端发送一个event,消息以data字段的形式传递。

客户端通过监听message事件来接收来自服务器的消息。当有新的消息到来时,服务器就会将消息推送到客户端,这种单向通讯方式与WebSocket相似,但WebSocket是基于全双工通讯的,通讯效率更高。

这里需要特别注意的是,SSE使用的是HTTP协议,通过长连接实现双向通讯,而非传统的websocket。

在Node.js中使用SSE

在Node.js中,我们可以使用npm安装sse中间件来实现SSE的功能。具体步骤如下:

步骤 1:安装sse

使用npm安装sse中间件:

步骤 2:实现SSE服务端

在Node.js中,实现SSE服务端也很简单,只需要引入sse中间件并创建一个HTTP服务器即可:

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

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

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

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

在上面的代码中,我们通过http.createServer()创建了一个HTTP服务器,并在res.writeHead()中设置了SSE协议需要的响应头。接下来,我们通过sse.send()方法向客户端发送了一条消息。

步骤 3:实现SSE客户端

客户端的代码也非常简单,我们可以通过以下代码实现:

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

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

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

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

我们使用new EvenSource()创建了一个SSE请求,通过addEventListener()方法监听了用于接收消息的message事件。其他事件包括open事件和error事件。

注意:在使用sse时,当有多个客户端连接到服务器时,服务器会为每个连接创建新的线程,逐渐增加服务器负担。因此对于大批量的实时数据传输,Websockets 是一个更好的选择。

给SSE协议添加自定义事件

除了默认的message事件外,我们还可以通过自定义事件来发送特定的消息。例如,你可以在服务端创建一个用于发送时间的事件:

然后在客户端通过添加事件监听器来接收事件和消息:

支持跨域访问

如果你需要使用SSE提供跨域服务,只需在服务端设置如下响应头:

总结

本文简要介绍了Node.js中使用SSE实现服务器向客户端推送消息的基本原理。通过访问服务端暴露的链接,客户端可以通过API发送请求并获取实时数据,实现了即时通讯的功能。另外在实现的过程中,还介绍了两个比较重要的事件:message和time。相信读者已经能够很好地理解SSE在实时通讯中的作用了。

完整代码请参考: https://github.com/shadowcz007/node-sse-example

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

纠错
反馈