基於node實現websocket協議

2022-09-26 09:57:11 字數 3113 閱讀 9071

一、協議

websocket是一種基於tcp之上的客戶端與伺服器全雙工通訊的協議,它在html5中被定義,也是新一代webapp的基礎規範之一。

它突破了早先的ajax的限制,關鍵在於實時性,伺服器可以主動推送內容 到客戶端!可能的應用有:多人**遊戲,即時聊天,實時監控,遠端桌面,新聞伺服器等等。

對於我自己,當前最想嘗試的是canvas+websocket組合起來能做什麼。

二、實現

由於握手的過程是乙個標準的http請求,因此 websocket 的實現有兩種選擇:1)tcp上實現; 2) 現有http軟體上實現。後者的優勢在於可以共用現有的http伺服器端口,並且不用重新實現認證功能和解析http請求的功能。

這個示例中使用的 node 的http模組。(tcp版及所有檔案見 附件)

1、node伺服器端**:

};// 包裝將要傳送的幀

var wrap = function(data)

// 解開接收到的幀

var unwrap = function(data)

var bind_sock_event = function(sock) )

.on('close',function() )

.on('end',function() )

.on('send',function(data) )

};var get_part = function(key)

return get_big_endian(part / spaces);

}var get_big_endian = function(n) ))

}var challenge = function(key1,key2,head)

var handshake = function(req,sock,head)

2、瀏覽器客戶端**:

websocket demo

三、細節

在 http 協議之上的 websocket 協議實現只有兩步:握手,傳送資料。

1、握手

握手的過程被稱為 challenge-response。首先客戶端發起乙個名為upgrade的http get請求,伺服器驗證此請求,給出101響應以表示接受此次協議公升級,握手即完成了。

chrome inspector美化過的握手資訊:

請求頭部分

host: websocket伺服器主機

connection: 連線型別

upgrade: 協議公升級型別

origin: 訪問**

sec-websocket 可選,子協議名稱,由應用自己定義,多個協議用空格分割。(*另外乙個僅剩的可選項是cookie)

sec-websocket-key1: 安全認證key,xhr請求不能偽造'sec-'開頭的請求頭。

sec-websocket-key2: 同上

key3: 響應體內容,8位元組隨機。

響應頭部分

sec-websocket-protocol: 必須包含請求的子協議名

sec-websocket-origin: 必須等於請求的**

sec-websocket-location: 必須等於請求的位址

challenge response: 響應體內容,根據請求中三個key計算得來,16位元組。

應答字串計算過程偽**:

part_1 = key1中所有數字 / key1中空格數量

part_2 同上

sum = big_endian(part_1)+big_endian(part_2)+key3

challenge_response = md5_digest(sum);

32位整數的big_endian計算策略:

node實現基於token的身份驗證

最近研究了下基於token的身份驗證,並將這種機制整合在個人專案中。現在很多 的認證方式都從傳統的seesion cookie轉向token校驗。對比傳統的校驗方式,token確實有更好的擴充套件性與安全性。由於http是無狀態的,它並不記錄使用者的身份。使用者將賬號與密碼傳送給伺服器後,後台通過校...

vue基於node方式部署

在根目錄下增加檔案server.js如圖所示 server.js中內容如下 const express require express const chalk require chalk const history require connect history api fallback port是...

基於node實現的批量轉換px到rem的工具

在專案中需要通過rem單位來實現頁面適配不同解析度,之前都是通過設定計算的比例為10或100手動計算,或者ide提供的外掛程式來實現,現在考慮通過node來實現乙個通用的批量轉換專案中的樣式檔案中單位的工具。開發的思路是以檔案為單位,按檔案來批量轉換,這時只需要設定一些與檔案相關的配置項來選擇需要轉...