The WebSocket API (WebSockets)

注意:此功能在 Web Workers 中可用。

WebSocket API 允许在用户浏览器和服务器之间建立双向交互式通信会话。使用此 API,您可以向服务器发送消息并接收响应,而无需轮询服务器以获取回复。

WebSocket API 提供了两种创建和使用 WebSocket 连接的替代机制:WebSocket 接口和 WebSocketStream 接口。

  • WebSocket 接口是稳定且具有良好的浏览器和服务器支持。但是,它不支持背压。因此,当消息到达速度快于应用程序处理速度时,它将通过缓冲这些消息来填满设备的内存,或因 CPU 使用率 100% 而变得无响应,或两者兼而有之。
  • WebSocketStream 接口是 WebSocket 的基于Promise 的替代方案。它使用Streams API 来处理消息的接收和发送,这意味着套接字连接可以自动利用流背压,从而调节读写速度以避免应用程序中的瓶颈。但是,WebSocketStream 是非标准的,目前仅在一个渲染引擎中受支持。

此外,WebTransport API 预计将取代许多应用程序中的 WebSocket API。WebTransport 是一个通用的、低级的 API,它提供了背压以及 WebSocketWebSocketStream 都不支持的许多其他功能,例如单向流、乱序交付以及通过数据报进行不可靠的数据传输。WebTransport 比 WebSockets 更复杂,并且其跨浏览器支持不如 WebSocket 广泛,但它能够实现复杂的解决方案。如果标准的 WebSocket 连接适合您的用例并且您需要广泛的浏览器兼容性,那么您应该使用 WebSockets API 来快速上手。但是,如果您的应用程序需要非标准的自定义解决方案,那么您应该使用 WebTransport API。

注意:如果页面具有打开的 WebSocket 连接,浏览器可能不会将其添加到bfcache。因此,建议在用户完成页面使用后关闭连接。请参阅处理 bfcache

接口

WebSocket

连接到 WebSocket 服务器然后发送和接收数据的首要接口。

WebSocketStream 非标准

用于连接到 WebSocket 服务器的基于 Promise 的接口;使用在连接上发送和接收数据。

CloseEvent

当连接关闭时,WebSocket 对象发送的事件。

MessageEvent

当从服务器接收到消息时,WebSocket 对象发送的事件。

HTTP 标头用于WebSocket 握手

Sec-WebSocket-Key

一个 HTTP 请求标头,其中包含来自客户端的随机数。这在WebSocket 初始握手中使用,以验证客户端是否明确打算打开 WebSocket。它由浏览器自动添加。

Sec-WebSocket-Accept

一个 HTTP 响应标头,在WebSocket 初始握手中使用,表示服务器愿意升级到 WebSocket 连接。指令中的值是根据相应请求中 Sec-WebSocket-Key 的值计算的。

Sec-WebSocket-Version

一个 HTTP 标头,在请求中指示客户端理解的 WebSocket 协议版本。在响应中,只有在服务器不支持所请求的协议版本时才会发送,并列出服务器支持的版本。

Sec-WebSocket-Protocol

一个 HTTP 标头,在请求中按首选顺序指示客户端支持的子协议。在响应中,它指示服务器从客户端偏好中选择的子协议。

Sec-WebSocket-Extensions

一个 HTTP 标头,在请求中按首选顺序指示客户端支持的 WebSocket 扩展。在响应中,它指示服务器从客户端偏好中选择的扩展。

指南

工具

  • AsyncAPI:一个用于描述基于 WebSocket 等协议的事件驱动架构的规范。您可以使用它来描述基于 WebSocket 的 API,就像您使用 OpenAPI 规范描述 REST API 一样。了解为什么您应该考虑将 AsyncAPI 与 WebSocket 一起使用以及如何做
  • µWebSockets:用于C++11Node.js 的高可伸缩性 WebSocket 服务器和客户端实现。
  • Socket.IO:一个基于长轮询/WebSocket 的第三方传输协议,适用于Node.js
  • SocketCluster:一个面向可伸缩性的 Node.js 的 pub/sub WebSocket 框架。
  • WebSocket-Node:一个面向 Node.js 的 WebSocket 服务器 API 实现。
  • Total.js:面向 Node.js 的 Web 应用程序框架(示例:WebSocket 聊天
  • SignalR:SignalR 在可用时将底层使用 WebSockets,并在不可用时优雅地回退到其他技术和技术,而您的应用程序代码保持不变。
  • Caddy:一个能够将任意命令(stdin/stdout)作为 WebSocket 代理的 Web 服务器。
  • ws:一个流行的面向 Node.js 的 WebSocket 客户端和服务器库。
  • cowboy:Cowboy 是一个小型、快速、现代的 Erlang/OTP HTTP 服务器,支持 WebSocket。
  • ZeroMQ:ZeroMQ 是一个可嵌入的网络库,可在进程内、IPC、TCP、UDP、TIPC、多播和 WebSocket 之间传输消息。
  • WebSocket King:一个用于帮助开发、测试和使用 WebSocket 服务器的客户端工具。
  • PHP WebSocket Server:用 PHP 编写的服务器,用于通过 WebSocket wss://ws:// 以及通过 ssl://tcp:// 的普通套接字处理连接。
  • Django Channels:Django 库,为 WebSockets(以及其他需要长期异步连接的协议)添加了支持。
  • (Phoenix) Channels:在 Elixir Phoenix 框架中使用 WebSocket 进行可伸缩的实时通信。
  • Phoenix LiveView:在 Elixir Phoenix 框架中通过 WebSocket 实现实时交互式 Web 体验。
  • Flask-SocketIO:使 Flask 应用程序能够实现客户端和服务器之间的低延迟双向通信。
  • Gorilla WebSocket:Gorilla WebSocket 是 WebSocket 协议的 Go 实现。

规范

规范
WebSocket
# the-websocket-interface

浏览器兼容性

api.WebSocket

api.WebSocketStream

另见