API WebSocket (WebSockets)

Note: This feature is available in Web Workers.

API WebSocket cho phép mở một phiên giao tiếp tương tác hai chiều giữa trình duyệt của người dùng và máy chủ. Với API này, bạn có thể gửi thông điệp đến máy chủ và nhận phản hồi mà không cần liên tục thăm dò máy chủ để chờ trả lời.

API WebSocket cung cấp hai cơ chế thay thế để tạo và sử dụng các kết nối web socket: giao diện WebSocket và giao diện WebSocketStream.

  • Giao diện WebSocket đã ổn định và được hỗ trợ tốt bởi trình duyệt lẫn máy chủ. Tuy nhiên, giao diện này không hỗ trợ backpressure. Vì vậy, khi thông điệp đến nhanh hơn tốc độ ứng dụng có thể xử lý, nó sẽ hoặc làm đầy bộ nhớ của thiết bị bằng cách đệm các thông điệp đó, hoặc khiến ứng dụng không phản hồi do sử dụng 100% CPU, hoặc cả hai.
  • Giao diện WebSocketStream là một lựa chọn thay thế dựa trên Promise cho WebSocket. Nó dùng Streams API để xử lý việc nhận và gửi thông điệp, nghĩa là các kết nối socket có thể tận dụng backpressure của luồng một cách tự động, điều chỉnh tốc độ đọc hoặc ghi để tránh nghẽn trong ứng dụng. Tuy nhiên, WebSocketStream không phải là chuẩn và hiện chỉ được hỗ trợ trong một bộ máy kết xuất.

Ngoài ra, WebTransport API được kỳ vọng sẽ thay thế API WebSocket trong nhiều ứng dụng. WebTransport là một API linh hoạt, cấp thấp, cung cấp backpressure và nhiều tính năng khác mà cả WebSocket lẫn WebSocketStream đều không hỗ trợ, chẳng hạn như luồng một chiều, truyền ngoài thứ tự, và truyền dữ liệu không tin cậy qua datagram. WebTransport phức tạp hơn WebSocket để sử dụng và khả năng hỗ trợ đa trình duyệt cũng không rộng bằng, nhưng nó cho phép triển khai các giải pháp tinh vi. Nếu các kết nối WebSocket chuẩn phù hợp với trường hợp sử dụng của bạn và bạn cần khả năng tương thích trình duyệt rộng, bạn nên dùng API WebSocket để nhanh chóng bắt đầu. Tuy nhiên, nếu ứng dụng của bạn yêu cầu một giải pháp tùy biến không chuẩn, thì bạn nên dùng WebTransport API.

Note: Nếu một trang đang mở kết nối WebSocket, trình duyệt có thể không thêm trang đó vào bfcache. Vì vậy, thực hành tốt là đóng kết nối khi người dùng đã rời khỏi trang. Xem làm việc với bfcache.

Giao diện

WebSocket

Giao diện chính để kết nối tới máy chủ WebSocket rồi gửi và nhận dữ liệu trên kết nối.

WebSocketStream Không chuẩn

Giao diện dựa trên promise để kết nối tới máy chủ WebSocket; dùng streams để gửi và nhận dữ liệu trên kết nối.

CloseEvent

Sự kiện mà đối tượng WebSocket phát ra khi kết nối đóng lại.

MessageEvent

Sự kiện mà đối tượng WebSocket phát ra khi nhận được thông điệp từ máy chủ.

Tiêu đề HTTP liên quan

Các tiêu đề HTTP được dùng trong WebSocket handshake:

Sec-WebSocket-Key

Một tiêu đề yêu cầu HTTP chứa một nonce từ phía máy khách. Tiêu đề này được trình duyệt tự động thêm vào trong WebSocket opening handshake để xác minh rằng máy khách thực sự có ý định mở một kết nối WebSocket. Trình duyệt sẽ tự động thêm nó.

Sec-WebSocket-Accept

Một response header HTTP được dùng trong WebSocket opening handshake để cho biết rằng máy chủ sẵn sàng nâng cấp sang kết nối WebSocket. Giá trị trong chỉ thị này được tính từ giá trị của Sec-WebSocket-Key trong yêu cầu tương ứng.

Sec-WebSocket-Version

Một tiêu đề HTTP trong các yêu cầu cho biết phiên bản của giao thức WebSocket mà máy khách hiểu. Trong phản hồi, nó chỉ được gửi nếu phiên bản giao thức được yêu cầu không được máy chủ hỗ trợ, và liệt kê các phiên bản mà máy chủ hỗ trợ.

Sec-WebSocket-Protocol

Một tiêu đề HTTP trong các yêu cầu cho biết các giao thức phụ mà máy khách hỗ trợ theo thứ tự ưu tiên. Trong phản hồi, nó cho biết giao thức phụ mà máy chủ đã chọn từ các lựa chọn của máy khách.

Sec-WebSocket-Extensions

Một tiêu đề HTTP trong các yêu cầu cho biết các tiện ích WebSocket mà máy khách hỗ trợ theo thứ tự ưu tiên. Trong phản hồi, nó cho biết tiện ích mà máy chủ đã chọn từ các lựa chọn của máy khách.

Hướng dẫn

Công cụ

  • AsyncAPI: Một đặc tả để mô tả các kiến trúc hướng sự kiện dựa trên những giao thức như WebSocket. Bạn có thể dùng nó để mô tả các API dựa trên WebSocket giống như cách bạn mô tả các API REST bằng đặc tả OpenAPI. Xem vì sao bạn nên cân nhắc dùng AsyncAPI với WebSocketcách thực hiện điều đó.
  • µWebSockets: Triển khai máy chủ và máy khách WebSocket có khả năng mở rộng cao cho C++11Node.js.
  • Socket.IO: Một giao thức truyền tải bên thứ ba dựa trên long polling/WebSocket cho Node.js.
  • SocketCluster: Một framework WebSocket pub/sub cho Node.js với trọng tâm là khả năng mở rộng.
  • WebSocket-Node: Một triển khai API máy chủ WebSocket cho Node.js.
  • Total.js: Framework ứng dụng web cho Node.js (Ví dụ: WebSocket chat)
  • SignalR: SignalR sẽ dùng WebSocket bên dưới khi có sẵn, và tự động chuyển sang các kỹ thuật và công nghệ khác khi không có, trong khi mã ứng dụng của bạn vẫn giữ nguyên.
  • Caddy: Một máy chủ web có thể proxy các lệnh tùy ý (stdin/stdout) dưới dạng websocket.
  • ws: một thư viện máy khách và máy chủ WebSocket phổ biến cho Node.js.
  • cowboy: Cowboy là một máy chủ HTTP nhỏ, nhanh và hiện đại cho Erlang/OTP với hỗ trợ WebSocket.
  • ZeroMQ: ZeroMQ là thư viện mạng có thể nhúng, truyền thông điệp qua in-process, IPC, TCP, UDP, TIPC, multicast và WebSocket.
  • WebSocket King: Một công cụ máy khách giúp phát triển, kiểm thử và làm việc với các máy chủ WebSocket.
  • PHP WebSocket Server: Máy chủ được viết bằng PHP để xử lý kết nối qua websockets wss:// hoặc ws:// và các socket bình thường qua ssl://, tcp://
  • Django Channels: Thư viện Django bổ sung hỗ trợ cho WebSocket (và các giao thức khác cần kết nối bất đồng bộ kéo dài).
  • (Phoenix) Channels: Giao tiếp thời gian thực có khả năng mở rộng bằng WebSocket trong framework Elixir Phoenix.
  • Phoenix LiveView: Trải nghiệm web tương tác theo thời gian thực thông qua WebSocket trong framework Elixir Phoenix.
  • Flask-SocketIO: cung cấp cho ứng dụng Flask khả năng giao tiếp hai chiều độ trễ thấp giữa máy khách và máy chủ.
  • Gorilla WebSocket: Gorilla WebSocket là một triển khai giao thức WebSocket bằng Go.

Thông số kỹ thuật

Thông số kỹ thuật
WebSockets
# the-websocket-interface

Tương thích trình duyệt

api.WebSocket

api.WebSocketStream

Xem thêm