搜索
首页web前端js教程使用服务器量事件实施推送技术

Implementing Push Technology Using Server-Sent Events

核心要点

  • Server-Sent Events (SSE) API 实现了推送技术,数据通过持续的开放连接流式传输到客户端,避免了反复建立新连接的开销。
  • 与允许双向通信的 WebSockets 不同,SSE 只允许服务器向客户端推送消息。然而,SSE 具有某些优势,例如支持自定义消息类型和自动重新连接断开的连接。
  • 客户端可以通过实现命名事件来处理事件流中的各种事件类型。此外,可以使用 EventSource 的 onerror 事件处理程序处理错误,并且客户端可以随时通过调用 close() 方法终止 EventSource 连接。

与 WebSockets 的比较

许多人完全不知道 SSE 的存在,因为它们常常被功能更强大的 WebSockets API 所掩盖。虽然 WebSockets 允许客户端和服务器之间进行双向全双工通信,但 SSE 只允许服务器向客户端推送消息。需要近乎实时性能或双向通信的应用程序可能更适合使用 WebSockets。但是,SSE 也比 WebSockets 具有某些优势。例如,SSE 支持自定义消息类型和自动重新连接断开的连接。这些功能可以在 WebSockets 中实现,但它们在 SSE 中默认可用。WebSockets 应用程序还需要支持 WebSockets 协议的服务器。相比之下,SSE 建立在 HTTP 之上,可以在标准 Web 服务器中实现。

检测支持

SSE 的支持度相对较高,Internet Explorer 是唯一一个尚不支持它们的 主要浏览器。但是,只要 IE 落后,就仍然需要提供功能检测。在客户端,SSE 使用 EventSource 对象实现——这是全局对象的一个属性。以下函数检测浏览器中 EventSource 构造函数是否可用。如果函数返回 true,则可以使用 SSE。否则,应使用轮询等后备机制。

function supportsSSE() {
  return !!window.EventSource;
}

连接

要连接到事件流,请调用 EventSource 构造函数,如下所示。您必须指定要订阅的事件流的 URL。构造函数将自动负责打开连接。

EventSource(url);

onopen 事件处理程序

建立连接后,将调用 EventSource 的 onopen 事件处理程序。事件处理程序将打开事件作为其唯一参数。以下示例显示了一个通用的 onopen 事件处理程序。

source.onopen = function(event) {
  // 处理打开事件
};

EventSource 事件处理程序也可以使用 addEventListener() 方法编写。此替代语法优于 onopen,因为它允许多个处理程序附加到同一事件。以下使用 addEventListener() 重写了之前的 onopen 事件处理程序。

source.addEventListener("open", function(event) {
  // 处理打开事件
}, false);

接收消息

客户端将事件流解释为一系列 DOM 消息事件。从服务器接收到的每个事件都会触发 EventSource 的 onmessage 事件处理程序。onmessage 处理程序将消息事件作为其唯一参数。以下示例创建了一个 onmessage 事件处理程序。

function supportsSSE() {
  return !!window.EventSource;
}

消息事件包含三个重要的属性——data、origin 和 lastEventId。顾名思义,data 包含实际的消息数据(字符串格式)。数据可能是 JSON 字符串,可以传递给 JSON.parse() 方法。origin 属性包含事件流在任何重定向后的最终 URL。应检查 origin 以验证是否仅从预期来源接收消息。最后,lastEventId 属性包含事件流中看到的最后一条消息标识符。服务器可以使用此属性将标识符附加到各个消息。如果从未见过任何标识符,则 lastEventId 将为空字符串。onmessage 事件处理程序也可以使用 addEventListener() 方法编写。以下示例显示了使用 addEventListener() 重写的之前的 onmessage 事件处理程序。

EventSource(url);

命名事件

通过实现 命名事件,单个事件流可以指定各种类型的事件。命名事件不是由消息事件处理程序处理的。相反,每种类型的命名事件都由其自己的唯一处理程序处理。例如,如果事件流包含名为 foo 的事件,则需要以下事件处理程序。请注意,foo 事件处理程序与消息事件处理程序相同,只是事件类型不同。当然,任何其他类型的命名消息都需要单独的事件处理程序。

source.onopen = function(event) {
  // 处理打开事件
};

处理错误

如果事件流出现问题,则会触发 EventSource 的 onerror 事件处理程序。错误的一个常见原因是连接中断。尽管 EventSource 对象会自动尝试重新连接到服务器,但在断开连接时也会触发错误事件。以下示例显示了一个 onerror 事件处理程序。

source.addEventListener("open", function(event) {
  // 处理打开事件
}, false);

当然,onerror 事件处理程序也可以使用 addEventListener() 重写,如下所示。

source.onmessage = function(event) {
  var data = event.data;
  var origin = event.origin;
  var lastEventId = event.lastEventId;
  // 处理消息
};

断开连接

客户端可以随时通过调用 close() 方法终止 EventSource 连接。close() 的语法如下所示。close() 方法不接受任何参数,也不返回任何值。

source.addEventListener("message", function(event) {
  var data = event.data;
  var origin = event.origin;
  var lastEventId = event.lastEventId;
  // 处理消息
}, false);

连接状态

EventSource 连接的状态存储在其 readyState 属性中。在其生命周期的任何时间点,连接都可以处于三种可能的状态之一——连接中、打开和关闭。以下列表描述了每种状态。

  • 连接中 – 创建 EventSource 对象时,它最初会进入连接中状态。在此期间,连接尚未建立。如果已建立的连接丢失,EventSource 也将转换到连接中状态。处于连接中状态的 EventSocket 的 readyState 值为 0。此值定义为常量 EventSource.CONNECTING。
  • 打开 – 已建立的连接被称为处于打开状态。处于打开状态的 EventSource 对象可以接收数据。readyState 值为 1 对应于打开状态。此值定义为常量 EventSource.OPEN。
  • 关闭 – 如果未建立连接并且未尝试重新连接,则 EventSource 被称为处于关闭状态。此状态通常通过调用 close() 方法进入。处于关闭状态的 EventSource 的 readyState 值为 2。此值定义为常量 EventSource.CLOSED。

以下示例显示了如何使用 readyState 属性检查 EventSource 连接。为了避免硬编码 readyState 值,该示例使用了状态常量。

function supportsSSE() {
  return !!window.EventSource;
}

结论

本文介绍了 SSE 的客户端方面。如果您有兴趣了解有关 SSE 的更多信息,我建议您阅读《服务器端 SSE》。我还撰写了一篇更实用的文章,介绍了 Node.js 中的 SSE。享受!

关于使用 SSE 实现推送技术的常见问题 (FAQ)

实现 SSE 的前提条件是什么?

要实现 SSE,您需要对 JavaScript 和 Node.js 有基本的了解。您还应该熟悉 HTTP 的概念及其工作原理。此外,了解事件驱动编程可能会有益,因为 SSE 基于此概念。

SSE 与 WebSockets 有何不同?

虽然 SSE 和 WebSockets 都提供实时数据更新,但它们的功能和用例有所不同。WebSockets 在客户端和服务器之间提供双向通信通道,允许双方随时发送数据。另一方面,SSE 是一条单向通信通道,只有服务器才能向客户端推送更新。这使得 SSE 更适合那些数据更新主要由服务器启动的应用程序。

SSE 可以与任何服务器端语言一起使用吗?

是的,SSE 可以与任何支持 HTTP 的服务器端语言一起使用。这包括 Node.js、Python、PHP、Ruby 等语言。关键是设置正确的 HTTP 标头并根据 SSE 规范格式化数据。

如何处理 SSE 的连接错误或中断?

用于在客户端实现 SSE 的 EventSource API 会在连接丢失时自动尝试重新连接到服务器。您还可以侦听 EventSource 对象上的“error”事件,以手动处理连接错误或中断。

我可以使用 SSE 从客户端向服务器发送数据吗?

不可以,SSE 旨在用于从服务器到客户端的单向通信。如果您需要从客户端向服务器发送数据,可以使用传统的 AJAX 请求或切换到双向通信技术,例如 WebSockets。

所有浏览器都支持 SSE 吗?

大多数现代浏览器都支持 SSE。但是,Internet Explorer 不支持 SSE。您可以使用 EventSource.js 等 polyfill 在不受支持的浏览器中添加对 SSE 的支持。

如何关闭 SSE 连接?

您可以通过调用 EventSource 对象上的 close() 方法来关闭 SSE 连接。这将阻止服务器向客户端发送更多更新。

我可以将 SSE 用于多用户实时应用程序吗?

是的,您可以将 SSE 用于多用户实时应用程序。但是,请记住,每个用户都会打开与服务器的单独连接。如果您有大量用户,这可能会导致服务器负载过高。

如何使用 SSE 发送不同类型的事件?

您可以通过在从服务器发送的数据中包含“event”字段来发送不同类型的事件。然后,客户端可以使用 EventSource 对象上的 addEventListener() 方法侦听这些特定事件类型。

我可以将 SSE 与 REST API 一起使用吗?

是的,您可以将 SSE 与 REST API 一起使用。服务器可以在资源更改时向客户端发送更新。这对于在不进行轮询的情况下使客户端与服务器状态保持同步非常有用。

以上是使用服务器量事件实施推送技术的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python vs. JavaScript:您应该学到哪种语言?Python vs. JavaScript:您应该学到哪种语言?May 03, 2025 am 12:10 AM

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架:为现代网络开发提供动力JavaScript框架:为现代网络开发提供动力May 02, 2025 am 12:04 AM

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

JavaScript,C和浏览器之间的关系JavaScript,C和浏览器之间的关系May 01, 2025 am 12:06 AM

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr

node.js流带打字稿node.js流带打字稿Apr 30, 2025 am 08:22 AM

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python vs. JavaScript:性能和效率注意事项Python vs. JavaScript:性能和效率注意事项Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript的起源:探索其实施语言JavaScript的起源:探索其实施语言Apr 29, 2025 am 12:51 AM

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

幕后:什么语言能力JavaScript?幕后:什么语言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在浏览器和Node.js环境中运行,依赖JavaScript引擎解析和执行代码。1)解析阶段生成抽象语法树(AST);2)编译阶段将AST转换为字节码或机器码;3)执行阶段执行编译后的代码。

Python和JavaScript的未来:趋势和预测Python和JavaScript的未来:趋势和预测Apr 27, 2025 am 12:21 AM

Python和JavaScript的未来趋势包括:1.Python将巩固在科学计算和AI领域的地位,2.JavaScript将推动Web技术发展,3.跨平台开发将成为热门,4.性能优化将是重点。两者都将继续在各自领域扩展应用场景,并在性能上有更多突破。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)