如何使用 Server-sent Events 实现实时页面更新

阅读时长 4 分钟读完

在 Web 应用程序中,实时 (real-time) 更新是十分重要的功能,它可以提升用户体验,增加应用程序的价值。常用的实现方法包括轮询(Polling)、WebSocket 和 Server-sent Events(称为 SSE)。本文将介绍如何使用 SSE 在前端实现实时页面更新。

Server-sent Events 简介

SSE 是一种浏览器与服务器之间的单向通信技术,它允许服务器实时向客户端推送消息。SSE 中的服务器维护一个长连接,在连接上发送事件(Event),然后浏览器通过 EventSource API 接收到事件并处理。与 WebSocket 不同,SSE 仅支持单向通信(服务器可以向客户端主动发送消息),通信协议使用的是 HTTP/1.1。

SSE 的好处包括:

  • 对于简单的实时更新场景而言,使用 SSE 比 WebSocket 更加轻量、简单易用,可以快速开发。
  • SSE 可以通过 HTTP 请求使用现有的网络基础设施进行通信,不需要额外的协议。
  • 在浏览器端,SSE 通过 EventSource API 提供了简单易用的接口,可以方便地处理消息。

使用 SSE 实现实时页面更新

下面将介绍如何使用 SSE 在前端实现实时页面更新的示例代码:

1. 创建服务器端代码

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

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

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

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

代码中,我们使用 Node.js 创建一个 HTTP 服务器,每隔一秒钟发送一个消息(当前时间)到客户端。其中,Content-Type 设置为 text/event-streamCache-Control 设置为 no-cacheConnection 设置为 keep-alive,这是 SSE 协议的标准要求。

2. 创建客户端代码

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

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

客户端代码非常简单,使用 EventSource API 创建一个 SSE 对象,并通过 onmessage 事件处理函数接收事件(这里我们把数据解析成 JSON 格式,以便于处理)。

3. 运行代码并测试

在命令行下执行 node app.js 启动 Node.js 服务器。在浏览器中运行 HTML 文件,打开控制台可以看到每隔一秒钟,页面上的时间会自动更新。

总结

SSE 是一种非常实用的技术,可以用于实现实时页面更新等功能。本文通过介绍 SSE 协议的原理、示例代码等内容,希望读者了解 SSE 在前端开发中的应用场景和具体实现方法。

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

纠错
反馈