如何在 Web 浏览器上使用 Server-Sent Events

阅读时长 4 分钟读完

简介

Server-Sent Events (SSE) 是一种基于 HTTP 协议的服务器推送技术,它允许服务器向客户端发送实时事件流,而不需要客户端不断地发起请求。SSE 是一种轻量级的通信协议,适合于实现实时通知、聊天室、在线游戏等应用场景。

本文将介绍如何在 Web 浏览器上使用 SSE 技术实现实时通知功能,包括 SSE 的基本原理、浏览器端的实现方法和一些注意事项。

SSE 原理

SSE 基于 HTTP 协议,使用长连接(Long Polling)实现服务器向客户端的实时通知。客户端通过向服务器发送一个 HTTP 请求,请求头中包含 Accept: text/event-stream,表示客户端希望接收服务器发送的事件流。服务器在接收到该请求后,保持连接打开状态,并向客户端发送一系列格式化的事件数据,每个事件数据以两个换行符结尾,客户端通过监听 EventSource 对象的 message 事件来接收数据。

SSE 事件数据的格式如下:

其中,event 表示事件名称,data 表示事件数据。如果事件名称为空,则表示这是一个普通的事件数据,否则表示这是一个具有事件名称的事件数据。

浏览器端实现

在浏览器端,我们可以使用 EventSource 对象来实现 SSE 功能。以下是一个简单的 SSE 示例代码:

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

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

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

在上面的代码中,我们通过 EventSource 对象向服务器发送一个 SSE 请求,请求的 URL 是 /sse。然后监听 message 事件和 error 事件,分别处理服务器发送的事件数据和错误信息。

在服务器端,我们可以使用 Node.js 的 http 模块和 sse-stream 模块来实现 SSE 功能。以下是一个简单的 SSE 服务器示例代码:

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

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

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

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

在上面的代码中,我们创建了一个 HTTP 服务器,并监听 /sse 路径的请求。当客户端发送 SSE 请求时,服务器会创建一个 sse 对象,并使用 setInterval 定时向客户端发送事件数据。

注意事项

在使用 SSE 技术时,需要注意以下几点:

  1. SSE 只能使用 HTTP 协议,不能使用 HTTPS 协议。
  2. SSE 请求是单向的,客户端只能接收服务器发送的事件数据,不能向服务器发送数据。
  3. SSE 请求不支持跨域访问,需要在服务器端设置 CORS 头部信息。
  4. SSE 请求可能会被浏览器缓存,需要在服务器端设置响应头部信息,禁止缓存。

总结

本文介绍了如何在 Web 浏览器上使用 Server-Sent Events 实现实时通知功能。我们了解了 SSE 的基本原理、浏览器端的实现方法和一些注意事项。使用 SSE 技术可以轻松实现实时通知、聊天室、在线游戏等应用场景,是一种非常有用的技术。

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

纠错
反馈