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

阅读时长 5 分钟读完

在传统的实时通讯中,我们通常使用轮询或 WebSocket 技术。但是轮询的延迟高、网络负载大,而 WebSocket 只有双向通讯、常常需要额外协议的支持等问题。而 Server-sent Events(简称 SSE)则是一种更简单、更轻量级、更易理解的实时通讯技术。

本文将介绍如何使用 SSE 实现实时新闻推送。

SSE 简介

Server-sent Events 是一种 HTML5 技术,它允许 Web 服务器实时向客户端发送数据。SSE 的主要特点如下:

  • SSE 是单向通讯;
  • SSE 基于 HTTP 协议;
  • SSE 使用纯文本(例如 JSON 或 XML)传输数据;
  • SSE 可以自定义事件类型,从而支持多种事件模型;
  • SSE 支持自动重连,以保障实时通讯的可靠性。

SSE 使用简单、可扩展,且不需要额外的浏览器插件或库。目前各大浏览器均支持 SSE。

实现步骤

  1. 在服务端创建一个 SSE 端点

Node.js 下可用如下代码创建一个 SSE 端点:

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

以上代码创建了一个简单的 SSE 端点,每秒向客户端发送一个时间戳。

  1. 在客户端使用 SSE API 连接 SSE 端点

我们可以使用如下代码连接到 SSE 端点:

一旦连接上了 SSE 端点,客户端就会收到数据。

详细说明

SSE 事件

SSE 事件格式如下:

其中 event-name 表示事件类型,event-data 表示事件数据。

例如:

SSE API

SSE API 包含如下属性和方法:

  • readyState:连接状态。取值为 0,1,2,分别表示连接尚未建立、连接已建立、连接已关闭;
  • onopen:连接成功时的回调函数;
  • onmessage:接收到数据时的回调函数;
  • onerror:连接发生错误时的回调函数;
  • close():关闭 SSE 连接。

示例代码

服务端代码(Node.js):

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

客户端代码:

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

在本示例中,服务端不断生成随机的新闻对象,并使用 SSE 协议向客户端发送。而客户端则通过 SSE API 接收到服务端发送的新闻对象,并展示在 HTML 页面上。

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

纠错
反馈