一、協議
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來實現乙個通用的批量轉換專案中的樣式檔案中單位的工具。開發的思路是以檔案為單位,按檔案來批量轉換,這時只需要設定一些與檔案相關的配置項來選擇需要轉...