Server-sent Events 实现客户端推送消息的教程

阅读时长 5 分钟读完

在 Web 应用程序开发中,经常会涉及客户端和服务器之间的消息通信。Websocket 通信是一个可行的解决方案,但受到诸多因素限制。而 Server-sent Events(SSE)是一种更加简单、轻量级的通信协议,支持客户端推送消息。

本文我们将介绍 Server-sent Events 的基本原理和使用方法,并提供一个完整的示例代码。

基本原理

SSE 是 HTML5 中一种全新的通信技术。它基于 HTTP 协议,通过浏览器和服务器之间的单向持续连接,实现了服务器向客户端推送消息的功能。

SSE 使用的是文本格式的数据,以 event-stream 形式传输。每个 SSE 消息由以下三部分组成:

  • 消息类型(event):表示消息类型的字符串,可以为空。
  • 数据(data):消息体的内容,可以为空。
  • ID(id):一个可选的字符串,用于区分消息。

每个 SSE 消息使用两个回车符(\n\n)结束。当 SSE 连接建立后,服务器会周期性地向客户端推送消息,直到连接关闭。

使用方法

服务端

使用 SSE 需要在服务端创建 SSE 路由,用于处理从客户端发来的请求和服务器主动向客户端推送的数据。在 Node.js 中可以使用第三方库 express 来实现 SSE 路由。

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

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

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

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

上述代码中,我们在 /sse 路由中创建了一个 SSE 连接,每隔 1 秒向客户端发送一条消息,消息类型为 time,数据为当前时间的字符串形式。

客户端

在客户端,我们可以使用 JavaScript 的 EventSource 类来创建 SSE 连接,并监听服务器发送的消息事件。

上述代码中,我们使用 EventSource 类创建了一个 SSE 连接,并在事件 time 上监听服务器发送的消息。每次服务器发送消息时,客户端会自动调用回调函数并输出消息内容。

总结

SSE 是一个轻量级的客户端推送消息协议,相较于 Websocket 更加简单、易用。它通过浏览器和服务器之间的单向持续连接,实现了服务器向客户端推送消息的功能。在实际应用中,我们可以使用第三方库 express 和 JavaScript 的 EventSource 类来实现 SSE 通信。

完整示例代码:

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

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

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

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

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

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

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

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

纠错
反馈