Server-Sent Events 在粘性会话中的应用

阅读时长 6 分钟读完

在前端开发中,通常我们会使用 Ajax 技术来与服务器交换数据。但是 Ajax 有一个很明显的缺点:它是基于轮询的,这意味着我们需要不断地向服务器发送请求来获取更新的数据。这样做的问题是,它会不断地创建新的 HTTP 连接,增加服务器和客户端的负担,增加带宽消耗,并且无法实时推送数据。

为了解决这个问题,HTML5 提出了一个新的特性:Server-Sent Events(SSE)。SSE 可以让服务器主动向客户端推送数据,而无需客户端发送请求。SSE 的实现方式是通过一个长期保持连接的 HTTP 连接,该连接保持打开状态,直到服务器通过该连接推送数据或者连接超时。

SSE 的应用

SSE 可以应用于一些需要实时推送数据的场景,例如:

  • 股票行情实时推送
  • 天气预报信息实时更新
  • 实时聊天室
  • 游戏实时推送数据

SSE 的优点

  • 实时性:SSE 可以做到服务器主动推送数据,实时性比 Ajax 更高。
  • 高效性:SSE 通过一个长期保持连接的 HTTP 连接来推送数据,减少了 HTTP 请求的开销,减少了带宽消耗。
  • 兼容性:SSE 在 HTML5 中成为了标准,几乎所有现代浏览器都支持该特性。
  • 容错性:SSE 有自动重连机制,如果连接断开,客户端可以自动重新连接。

SSE 的基本用法

SSE 的基本用法和普通的 Ajax 请求非常相似,但是 SSE 是通过 EventSource 对象来处理的。

在客户端,我们可以使用如下代码创建一个 EventSource 对象:

其中,/sse 是 SSE 服务端的地址。客户端创建 EventSource 对象时,就会自动与服务器建立长期保持连接的 HTTP 连接。

在服务器端,我们需要创建一个 HTTP 接口来向客户端推送数据。推送数据的方式是通过将数据发送到客户端保持连接的 HTTP 连接。

为了向客户端推送数据,我们可以使用如下代码:

其中,data 表示推送数据的类型,hello 是要推送的数据。重要的是,每一个推送数据的事件都以 \n\n 结束,表示已经结束了。

完整的示例代码如下:

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

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

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

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

------------------- ------- -- ------------------------
展开代码

在浏览器中打开 http://localhost:3000,可以看到我们实时地在客户端界面中显示当前的时间。

SSE 在粘性会话中的应用

Web 应用中的「粘性会话」是指用户在 Web 上保持登录状态,并且他/她的状态能够在页面之间共享的一种机制。在粘性会话中,用户的数据通常保存在服务器的会话中。SSE 可以很好地应用于粘性会话中。例如,我们可以使用 SSE 在用户登录后显示一个实时的「欢迎回来」信息。

客户端代码如下:

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

      ------------------------------------- --------------- -
        ----- ---- - -----------
        -------------------------------------------- - -----
      ---
    ---------
  -------
  ------
    ---- -------------------
  -------
-------
展开代码

服务器端代码如下:

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

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

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

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

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

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

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

------------------- -- -- -
  ------------------- ------- -- ------------------------
---
展开代码

当用户登录后,我们设置了一个会话,将用户的信息存储在服务器上。当用户访问 /welcome 时,首先检查该用户是否已经登录,并且在保持连接的 HTTP 连接上推送实时的消息。

总结

Server-Sent Events 是一种非常有用的技术,它可以让服务器主动推送实时数据给客户端。该技术比 Ajax 更为高效和实时,非常适用于大型数据的实时通讯和展示。SSE 在粘性会话中的应用也非常广泛,可以帮助我们实现简单而又实用的功能。

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

纠错
反馈

纠错反馈