WebSocket API (WebSocket)
備註: 此功能可在 Web Worker 中使用。
WebSocket API 讓使用者瀏覽器與伺服器之間可以開啟雙向互動的通訊會話。使用此 API,你可以傳送訊息到伺服器並接收回應,而無需輪詢伺服器以取得回覆。
WebSocket API 提供了兩種建立和使用 Web Socket 連線的替代機制:WebSocket
介面和 WebSocketStream
介面。
WebSocket
介面穩定,並有良好的瀏覽器和伺服器支援。然而,它不支援背壓。因此,當訊息到達的速度快於應用程式處理的速度時,它會透過緩衝這些訊息來填滿裝置的記憶體、因 100% 的 CPU 使用率而變得無回應,或兩者兼而有之。WebSocketStream
介面是基於Promise
的WebSocket
替代方案。它使用 Streams API 來處理接收和傳送訊息,這意味著通訊端連線可以自動利用串流背壓,調節讀取或寫入的速度,以避免應用程式中的瓶頸。然而,WebSocketStream
是非標準的,目前只有一個繪製引擎支援。
此外,WebTransport API 預計將在許多應用程式中取代 WebSocket API。WebTransport 是一個多功能、低階的 API,它提供了背壓和許多 WebSocket
或 WebSocketStream
都不支援的功能,例如單向串流、亂序傳遞,以及透過資料包進行的不可靠資料傳輸。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++11 和 Node.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 |