服务器推送技术:Server-Sent Events 原理和使用

阅读时长 5 分钟读完

在现代 web 应用开发中,实时通信机制已经成为非常重要的一部分。它可以使 web 应用更加互动和动态化。服务器推送技术是一种实现实时通信的方式,它可以让服务器主动地向客户端发送消息而不需要客户端发起请求,从而实现了实时更新。

本文将介绍一种服务器推送技术:Server-Sent Events,讲解其原理和应用。并且,我们还将通过示例代码演示如何使用 Server-Sent Events 与服务器进行交互。

Server-Sent Events 简介

Server-Sent Events(简称 SSE)是一种用于服务器推送的技术。与 WebSockets 不同,SSE 是基于 HTTP 协议的,可以在浏览器和任何 HTTP 服务器之间实现实时通信。

SSE 的主要优点在于,它具有更高的兼容性和可靠性,而且易于实现。使用 SSE,客户端可以直接接收服务器发送的消息。在 SSE 中,服务器向客户端发送数据的时间是无限的,客户端可以保持连接,直到关闭该连接或断开与服务器的连接。

Server-Sent Events 原理

SSE 基于一个持久的 HTTP 连接,使用了专门的 MIME 类型和事件流数据格式。

MIME 类型

事件流的 MIME 类型是 text/event-stream,这告诉浏览器接收到的数据是一组事件流,并且要解析这些事件。其中,text 表示这是一个文本流,而 event-stream 表示这是一个事件流。

事件流数据格式

事件流数据格式是基于纯文本的,具有一定的结构,如下所示:

每个事件都以 event: 开始,后面跟着事件的名称。如果不需要事件名称,可以省略该行。事件名称仅用于标识事件,并没有其他实际作用。

下一行以 data: 开始,后跟一个将会被解释为事件对象的 JSON 格式的数据流。如果不需要数据,可以省略该行。

除了 data 以外,还有两个其他选项可以在事件流数据格式中使用:

  • id::一个可选的事件标识符,每个事件都可以有一个唯一的 id。
  • retry::一个可选的建议重新连接的毫秒数,如果连接意外断开,则客户端应该在这段时间后重新连接。

SSE 的通信流程

SSE 的通信流程如下:

  1. 客户端向服务器发送一个 HTTP 请求。
  2. 服务器发送响应标头,包括 Content-Type: text/event-stream
  3. 服务器期望的客户端在保持连接的同时保持该 HTTP 请求的行为持续执行,即不在响应后断开连接。
  4. 服务器根据需要向客户端推送事件流。

使用 Server-Sent Events

在浏览器中使用 SSE 并不困难。我们可以使用 JavaScript 在客户端发起 SSE 请求,并在回调函数中处理来自服务器的事件。下面的代码演示了如何使用 SSE:

在上面的代码中,我们创建了一个新的 EventSource 对象,并指定它向 http://localhost:3000/sse 发送请求。在服务器向这个 URL 发送数据后,会触发 onmessage 事件,我们可以从该事件中获取处理来自服务器推送的数据。

在服务器端,我们可以使用 Node.js 和 Express 去创建一个 SSE 端点:

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

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

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

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

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

在我们的服务器代码中,我们向客户端推送一个带有名称 message 的事件,该事件的数据是一个 JSON 对象:

总结

Server-Sent Events 是一个可靠、兼容性高的服务器推送技术。通过本文的介绍,我们可以知道 SSE 的原理和使用方法。在实际开发中,我们可以使用 SSE 为我们的应用程序实现实时通信,以实现更高级的应用程序。

如果您想了解更多有关 SSE 的信息,请阅读 SSE 规范文档以获取更多详细信息。

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

纠错
反馈