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,它提供了背压以及 WebSocket 或 WebSocketStream 都不支持的许多其他功能,例如单向流、乱序交付以及通过数据报进行不可靠的数据传输。WebTransport 比 WebSockets 更复杂,并且其跨浏览器支持不如 WebSocket 广泛,但它能够实现复杂的解决方案。如果标准的 WebSocket 连接适合您的用例并且您需要广泛的浏览器兼容性,那么您应该使用 WebSockets API 来快速上手。但是,如果您的应用程序需要非标准的自定义解决方案,那么您应该使用 WebTransport API。
注意:如果页面具有打开的 WebSocket 连接,浏览器可能不会将其添加到bfcache。因此,建议在用户完成页面使用后关闭连接。请参阅处理 bfcache。
接口
WebSocket-
连接到 WebSocket 服务器然后发送和接收数据的首要接口。
WebSocketStream非标准-
用于连接到 WebSocket 服务器的基于 Promise 的接口;使用流在连接上发送和接收数据。
CloseEvent-
当连接关闭时,WebSocket 对象发送的事件。
MessageEvent-
当从服务器接收到消息时,WebSocket 对象发送的事件。
相关 HTTP 标头
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++11 和Node.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
加载中…