使用 Server-sent Events(SSE)实现即时通讯服务

阅读时长 4 分钟读完

介绍

Server-sent Events(SSE)是 HTML5 中的一项功能,它允许从服务器的推送事件到客户端,建立一种单向的、持久性的连接。相较于 WebSocket 和 AJAX,SSE 更加轻量级,且能更好地处理丢包或连接断开的情况。

SSE 最初用于实现类似于即时通讯的功能,如聊天室和实时股票价格更新等。本文将介绍如何使用 SSE 实现一个简单的即时通讯服务。

准备工作

在本文的示例中,我们需要一个 Node.js 服务器,并使用 Express 框架作为 HTTP 服务器。同时,需要在浏览器端使用 JavaScript 代码来建立 SSE 连接。可以使用任何一种前端框架,如 jQuery 或 React。

实现 SSE 服务

服务端代码

首先,在 Node.js 中安装 Express:

创建一个 app.js 文件,并在其中写入以下代码:

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

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

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

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

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

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

代码中,我们首先创建一个 Express 应用,并使用 express.static() 中间件来为 public 目录中的静态文件提供服务。然后,我们创建了一个 /sse 路由来处理 SSE 连接的请求。

/sse 路由中,我们设置了响应的类型和额外的响应头信息,以便 SSE 客户端和服务器之间的通信能够正常建立。然后,我们在 sendEvents() 函数中定时向客户端推送事件,代码中是每隔 1 秒向客户端发送一个随机字符串。

最后,我们启动了 HTTP 服务器,并监听端口号为 3000 的请求。

客户端代码

客户端代码非常简单。我们只需要在 JavaScript 中创建一个 EventSource 对象,并指定 SSE 服务器的地址即可完成 SSE 连接的建立。以下是一个简单的例子:

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

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

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

在上面的代码中,我们将 /sse 作为参数传递给 EventSource 构造函数。然后,我们添加了一个 message 事件监听器,以便能够接收到从服务器发送的数据。在事件监听器中,我们只是简单地将数据打印到控制台上。

同时,我们还添加了一个 error 事件监听器,以便在出现问题时能够及时发现。

运行程序

在项目的根目录下,运行以下命令启动 HTTP 服务器:

在浏览器中打开 http://localhost:3000,可以看到控制台上每隔一秒钟打印出一个随机字符串。

总结

本文介绍了如何使用 SSE 实现一个简单的即时通讯服务。相较于 WebSocket,SSE 更加轻量级,且适用于单向、不需要实时响应的通信场景。但是,在需要双向通信或实时响应的情况下,WebSocket 仍然是更好的选择。

本文示例代码已经上传到 GitHub 上,感兴趣的读者可以进一步学习和探索。

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

纠错
反馈