WebSocket API (WebSocket)

備註: 此功能可在 Web Worker 中使用。

WebSocket API 讓使用者瀏覽器與伺服器之間可以開啟雙向互動的通訊會話。使用此 API,你可以傳送訊息到伺服器並接收回應,而無需輪詢伺服器以取得回覆。

WebSocket API 提供了兩種建立和使用 Web Socket 連線的替代機制:WebSocket 介面和 WebSocketStream 介面。

  • WebSocket 介面穩定,並有良好的瀏覽器和伺服器支援。然而,它不支援背壓。因此,當訊息到達的速度快於應用程式處理的速度時,它會透過緩衝這些訊息來填滿裝置的記憶體、因 100% 的 CPU 使用率而變得無回應,或兩者兼而有之。
  • WebSocketStream 介面是基於 PromiseWebSocket 替代方案。它使用 Streams API 來處理接收和傳送訊息,這意味著通訊端連線可以自動利用串流背壓,調節讀取或寫入的速度,以避免應用程式中的瓶頸。然而,WebSocketStream 是非標準的,目前只有一個繪製引擎支援。

此外,WebTransport API 預計將在許多應用程式中取代 WebSocket API。WebTransport 是一個多功能、低階的 API,它提供了背壓和許多 WebSocketWebSocketStream 都不支援的功能,例如單向串流、亂序傳遞,以及透過資料包進行的不可靠資料傳輸。WebTransport 的使用比 WebSockets 更複雜,其跨瀏覽器支援也不那麼廣泛,但它能夠實現複雜的解決方案。如果標準的 WebSocket 連線很適合你的使用案例,並且你需要廣泛的瀏覽器相容性,你應該使用 WebSockets API 來快速上手。然而,如果你的應用程式需要非標準的自訂解決方案,那麼你應該使用 WebTransport API。

備註: 雖然 WebSocket 連線在功能上與標準的 Unix 風格通訊端有些相似,但它們之間沒有關聯。

介面

WebSocket

用於連線到 WebSocket 伺服器,然後在連線上傳送和接收資料的主要介面。

WebSocketStream Non-standard

基於 Promise 的介面,用於連線到 WebSocket 伺服器;使用串流在連線上傳送和接收資料。

CloseEvent

當連線關閉時,由 WebSocket 物件傳送的事件。

MessageEvent

當從伺服器接收到訊息時,由 WebSocket 物件傳送的事件。

相關的 HTTP 標頭

HTTP 標頭用於 WebSocket 交握中:

Sec-WebSocket-Key

一個 HTTP 請求標頭,包含來自用戶端的 nonce。這在 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:一個專注於可擴展性的 pub/sub WebSocket 框架,適用於 Node.js
  • WebSocket-Node:一個適用於 Node.js 的 WebSocket 伺服器 API 實作。
  • Total.js:適用於 Node.js 的 Web 應用程式框架(範例:WebSocket 聊天室
  • SignalR:當 WebSocket 可用時,SignalR 會在底層使用它,當不可用時,它會優雅地降級到其他技術,而你的應用程式碼保持不變。
  • Caddy:一個能夠將任意命令(stdin/stdout)代理為 WebSocket 的 Web 伺服器。
  • ws:一個流行的 WebSocket 用戶端和伺服器函式庫,適用於 Node.js
  • cowboy:Cowboy 是一個小巧、快速且現代的 HTTP 伺服器,適用於 Erlang/OTP,並支援 WebSocket。
  • ZeroMQ:ZeroMQ 是一個可嵌入的網路函式庫,可在行程內、IPC、TCP、UDP、TIPC、多播和 WebSocket 之間傳遞訊息。
  • WebSocket King:一個用戶端工具,可協助開發、測試和使用 WebSocket 伺服器。
  • PHP WebSocket Server:一個用 PHP 撰寫的伺服器,可透過 websockets 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 實作。

規範

Specification
WebSockets
# the-websocket-interface

瀏覽器相容性

api.WebSocket

api.WebSocketStream

參見