使用 Server-sent Events 实现实时推送

阅读时长 8 分钟读完

在 Web 应用程序中,实现实时通信一直是一个挑战。而 Server-sent Events(简称 SSE)就是一种简单且有效的实时推送技术。本文将介绍 SSE 并提供一些示例代码,帮助您了解如何在前端应用程序中使用 SSE。

什么是 Server-sent Events?

Server-sent Events 是一种基于 HTTP 的实时推送技术。它提供了一种双向通信的机制,它可以使服务器实时地将数据推送到客户端。SSE 与 WebSockets 相比有以下几个优点:

  • 基于标准的 HTTP 和 HTTPS 协议;
  • 支持服务器推送的事件类型;
  • 自动重连机制;
  • 阻止浏览器默认行为的能力(使用事件 event.preventDefault())。

SSE 是 HTML5 的一部分,它是一种比 WebSockets 更轻量级的替代方案并且早已被所有主流浏览器支持。

如何使用 Server-sent Events?

基本语法

使用 SSE,首先要使用 EventSource 对象来创建与服务器端的连接:

其中 /stream 是服务器端的 SSE 端点。

然后,可以监听 source 对象触发的事件:

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

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

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

source.onopen 事件在连接建立时触发,source.onmessage 事件在服务器端发送消息时触发,source.onerror 事件在连接发生错误时触发。

服务器端实现

服务器端要向客户端推送消息,可以使用以下代码:

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

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

其中,event: eventType 表示事件类型,data: ${JSON.stringify(data)} 表示事件数据,\n\n 表示消息结束。

取消 SSE 连接

SSE 连接可以通过以下代码取消:

自动重连机制

SSE 支持自动重连机制,即客户端在连接丢失时自动重新连接。要启用自动重连机制,请添加以下代码:

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

阻止浏览器默认行为

在 SSE 连接建立时,浏览器会自动发出一个 OPTIONS 请求。要阻止此请求,请添加以下代码:

示例代码

以下是一个使用 SSE 实现的简单聊天室:

Client:

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

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

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

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

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

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

Server:

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

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

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

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

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

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

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

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

在以上代码中,客户端向服务器发送聊天消息,服务器将消息存储到数组中,然后发送事件消息到客户端。客户端接收到消息后将消息显示在聊天室中。

总结

Server-sent Events 是一种简单有效的实现实时推送的技术,它支持自动重连机制和阻止浏览器默认行为的能力,适用于实现简单的实时通信场景。在实际的应用场景中,您可以根据需求使用 SSE 或 WebSockets 等其他实时通信技术。

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

纠错
反馈