WebSocket 是一種基于TCP的網絡通信協議,允許瀏覽器和服務器之間進行全雙工、實時、低延遲的雙向數據傳輸。它突破了傳統HTTP協議的限制(請求-響應模式),特別適合需要實時通信的場景(如聊天、實時數據推送、游戲等)。
核心特點
-
全雙工通信
客戶端和服務器可以同時發送和接收數據,無需等待對方的響應。 -
持久連接
連接建立后(通過HTTP握手),會保持打開狀態,直到任意一方主動關閉,避免了頻繁建立連接的開銷。 -
低延遲
由于連接復用和實時傳輸,相比輪詢或長輪詢(Long Polling),延遲顯著降低。 -
二進制和文本數據支持
可以傳輸文本(如JSON)和二進制數據(如圖片、視頻)。 -
跨域支持
原生支持跨域通信,無需額外配置(如CORS)。
工作原理
-
握手階段(HTTP升級)
客戶端通過HTTP請求發送升級協議頭,服務器確認后,連接從HTTP升級為WebSocket:// 客戶端請求 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat Sec-WebSocket-Version: 13// 服務器響應 HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
-
數據傳輸階段
握手成功后,連接轉為TCP通道,雙方通過**幀(Frame)**格式交換數據,無需HTTP頭部,開銷極小。 -
連接關閉
任意一方發送關閉幀(Close Frame)終止連接。
與HTTP的對比
特性 | HTTP | WebSocket |
---|---|---|
通信模式 | 請求-響應(半雙工) | 全雙工 |
連接狀態 | 短連接(每次請求新建) | 持久連接 |
實時性 | 低(需輪詢) | 高(實時推送) |
協議開銷 | 高(每次請求帶頭部) | 低(僅握手時用HTTP) |
典型場景 | 靜態資源、API調用 | 聊天、實時數據更新 |
應用場景
-
實時通信
- 即時聊天(如微信、QQ)、在線客服。
- 多人協作工具(如Google Docs的實時編輯)。
-
數據推送
- 股票行情、體育賽事比分、天氣預報更新。
- 消息通知(如郵件、社交平臺提醒)。
-
游戲與直播
- 實時多人游戲(如在線棋牌)。
- 音視頻直播彈幕、互動功能。
-
物聯網(IoT)
- 設備狀態監控、遠程控制(如智能家居)。
實現方式
客戶端(瀏覽器)
使用JavaScript的WebSocket
API:
// 建立連接
const ws = new WebSocket('ws://example.com/socket');// 連接打開時觸發
ws.onopen = () => {ws.send('Hello, server!');
};// 收到消息時觸發
ws.onmessage = (event) => {console.log('Received:', event.data);
};// 連接關閉時觸發
ws.onclose = () => {console.log('Connection closed');
};
服務端
常見的服務器端實現:
- Node.js:使用
ws
、socket.io
或uWebSockets.js
庫。 - Java:使用Spring WebSocket、Jetty或Tomcat內置支持。
- Python:使用
websockets
、Tornado
或Django Channels
。 - Go:使用標準庫
net/http
中的WebSocket支持。
注意事項
-
兼容性
現代瀏覽器(IE 10+、Chrome、Firefox等)均支持,但需注意舊版瀏覽器的兼容性。 -
代理與防火墻
部分企業防火墻可能限制WebSocket連接,需配置允許ws://
或wss://
(TLS加密)協議。 -
心跳機制
為避免連接被中間設備斷開,需實現心跳包(Ping/Pong幀)。 -
安全性
生產環境應使用wss://
(WebSocket over TLS)加密傳輸,防止數據被竊聽。
總結
WebSocket是現代Web應用中實現實時通信的首選技術,它通過持久連接和全雙工通信,解決了HTTP協議在實時性方面的局限,廣泛應用于需要即時數據交互的場景。