Server-Sent Events:扩展 HTTP 建立 Websockets 的替代品

阅读时长 3 分钟读完

简介

随着实时互动应用不断增多,Websockets 已成为今天最被广泛应用的客户端-服务器之间通信标准。Websockets 通过提供一个持久的双向通信管道(从客户端到服务器的通信以及从服务器到客户端的通信)来优化现有的 HTTP 请求-响应模型。但是,Websockets 作为一种通信技术,还有一些潜在的缺点,例如,需要特殊处理心跳等情况,并且需要专用的协议。与 Websockets 相比,Server-Sent Events(简称 SSE)是一种更为轻量级的实时通信技术,旨在扩展 HTTP 协议,使其能够实现某些易于实现和使用的 Websockets 功能。SSE 优雅地解决了多种现有通信技术的常见问题。通过使用服务器推送技术,SSE 可以使服务器将数据推送到客户端,并实现 HTTP 的长轮询。本文将阐述 SSE 的内部机制,以及如何在前端中轻松使用该技术。

SSE 如何工作

SSE 使用简单的 HTTP 协议,来获取实时的单向服务器推送,它的目标是扩展 HTTP 协议以更好地处理服务器推送。它使用一个好的 Proxy 服务器,结合持久性连接、事件流和流式处理的概念来实现。与 Websockets 不同,它只能以单向流的形式向客户端提供数据(也就是说,数据从服务器流向客户端),但这并不意味着它的功能受到了限制。

SSE 的请求遵循标准的 HTTP 协议,但在请求头中使用了特殊的 text/event-stream 格式。这告诉服务器要发送一个单向的流式消息(即事件流)到客户端。客户端请求头包含以下属性:

服务器设置响应头,将消息发送到客户端。响应包括事件流数据,以及每个消息都需要放在一个事件类型名称下,如下所示:

  • data::消息内容
  • event::事件名称
  • retry::几秒钟后重新连接

每个事件用一个空行分隔,最后的空行表明消息的结束。客户端接收事件后,可以执行适当的操作。

如何在前端中使用 SSE

在前端中使用 SSE 可以为应用程序的实时通信提供一个简化的解决方案。

首先,创建一个 EventSource 对象:

我们在客户端创建一个 EventSource 对象,连接到 /sse-api 路径,将监听来自服务器的事件流。

接下来,我们需要处理所接收的事件:

通过 addEventListener 方法为事件流的每个消息类型添加一个监听器。在上述代码中,“customEvent”是自定义的事件名称。

使用 SSE 可以让我们在简化的且易于使用的方式下,实现实时通信,而不必使用 Websockets 的特殊处理方式以及协议。例如,我们可以使用 SSE 在 Web 应用程序中实现即时消息通知,而无需强制 用户进行手动更新页面。

总结

SSE 提供了一种可靠且简单的方法来处理服务器到客户端的实时通信。它通过扩展 HTTP 协议,将其与历史记录和缓存功能集成,以实现持久性连接和事件流。使用 SSE 能够极大地简化实时通信的开发,而不必过分依赖其他方案,例如 Websockets。在 SSE 中,服务器负责发送数据,客户端负责接收和处理数据。通过使用 EventSource 对象,可以在前端轻松实现服务器到客户端的实时通信,并创建各种实时 Web 应用程序。

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

纠错
反馈