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

另見