本文實例講述了node.js 使用 net 模塊模擬 websocket 握手進行數(shù)據(jù)傳遞操作。分享給大家供大家參考,具體如下:
websocket 是一種讓瀏覽器與服務(wù)器之間建立持久的連接,并能進行雙向數(shù)據(jù)傳輸?shù)囊环N協(xié)議。
websocket 屬性應(yīng)用層協(xié)議,基于tcp傳輸協(xié)議,并復(fù)用http的握手通道。
一、如何進行websocket連接。
websocket復(fù)用了http的握手通道,客戶端通過http請求與服務(wù)端進行協(xié)商,升級協(xié)議。協(xié)議升級完后,后面的數(shù)據(jù)交換則遵照websocket協(xié)議。
1、客戶端申請協(xié)議升級
Request URL: ws://localhost:8888/Request Method: GETConnection: UpgradeUpgrade: websocketSec-WebSocket-Version: 13Sec-WebSocket-Key: uR5YP/BMO6M24tAFcmHeXw==Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bitsConnection: Upgrade 表示要升級協(xié)議 Upgrade: websocket 表示升級到websocket協(xié)議 Sec-WebSocket-Version: 13 表示websocket的版本 Sec-WebSocket-Key 表示websocket的驗證,防止惡意的連接,與服務(wù)端響應(yīng)的Sec-WebSocket-Accept是配套。
2、服務(wù)端響應(yīng)協(xié)議升級
Status Code: 101 Switching ProtocolsConnection: UpgradeSec-WebSocket-Accept: eS92kXpBNI6fWsCkj6WxH6QeoHs=Upgrade: websocket
Status Code:101 表示狀態(tài)碼,協(xié)議切換。
Sec-WebSocket-Accept 表示服務(wù)端響應(yīng)的校驗,與客戶端的Sec-WebSocket-Key是配套的。
3、Sec-WebSocket-Accept是如何計算的
將 Sec-WebSocket-Key 的值與 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接。
然后通過sha1計算,再轉(zhuǎn)成base64。
const crypto = require('crypto');function getSecWebSocketAccept(key) { return crypto.createHash('sha1') .update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11') .digest('base64');}console.log(getSecWebSocketAccept('uR5YP/BMO6M24tAFcmHeXw=='));4、協(xié)議升級完后,后續(xù)的數(shù)據(jù)傳輸就需要按websocket協(xié)議來走。
websocket客戶端與服務(wù)端通信的最小單位是 幀,由1個或多個幀組成完整的消息。
客戶端:將消息切割成多個幀,發(fā)送給服務(wù)端。
服務(wù)端:接收到消息幀,將幀重新組裝成完整的消息。
5、數(shù)據(jù)幀的格式
單位是1個比特位,F(xiàn)IN,PSV1,PSV2,PSV3 占1個比特位,opcode占4個比特位。
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7+-+-+-+-+-------+-+-------------+-------------------------------+|F|R|R|R| opcode|M| Payload len | Extended payload length ||I|S|S|S| (4) |A| (7) | (16/64) ||N|V|V|V| |S| | (if payload len==126/127) || |1|2|3| |K| | |+-+-+-+-+-------+-+-------------+-------------------------------+| Extended payload length continued, if payload len == 127 |+-------------------------------+-------------------------------+| |Masking-key, if MASK set to 1 |+-------------------------------+-------------------------------+| Masking-key (continued) | Payload Data |+-------------------------------+-------------------------------+| Payload Data continued ... |+---------------------------------------------------------------+| Payload Data continued ... |+---------------------------------------------------------------+
新聞熱點
疑難解答
圖片精選