WebSocket 是 HTML5 一種新的協(xié)議彼硫。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信凌箕,能更好的節(jié)省服務(wù)器資源和帶寬并達到實時通訊,它建立在 TCP 之上串绩,同 HTTP 一樣通過 TCP 來傳輸數(shù)據(jù)芜壁,但是它和 HTTP 最大不同是:
1.WebSocket 是一種雙向通信協(xié)議,在建立連接后顷牌,WebSocket 服務(wù)器和 Browser/Client Agent 都能主動的向?qū)Ψ桨l(fā)送或接收數(shù)據(jù),就像 Socket 一樣运挫;
2.WebSocket 需要類似 TCP 的客戶端和服務(wù)器端通過握手連接谁帕,連接成功后才能相互通信。
? ? ? ?相對于傳統(tǒng) HTTP 每次請求-應(yīng)答都需要客戶端與服務(wù)端建立連接的模式关划,WebSocket 是類似 Socket 的 TCP 長連接的通訊模式裤翩,一旦 WebSocket 連接建立后,后續(xù)數(shù)據(jù)都以幀序列的形式傳輸筐带。在客戶端斷開 WebSocket 連接或 Server 端斷掉連接前,不需要客戶端和服務(wù)端重新發(fā)起連接請求。在海量并發(fā)及客戶端與服務(wù)器交互負載流量大的情況下作儿,極大的節(jié)省了網(wǎng)絡(luò)帶寬資源的消耗妓雾,有明顯的性能優(yōu)勢君珠,且客戶端發(fā)送和接受消息是在同一個持久連接上發(fā)起策添,實時性優(yōu)勢明顯唯竹。
WebSocket握手請求(使用http請求完成)
清單 1.WebSocket 客戶端連接報文
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection:?UpgradeSec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin:http://localhost:8080
Sec-WebSocket-Version: 13
////”Upgrade:websocket”參數(shù)值表明這是 WebSocket 類型請求,WebSocket-Key”是 WebSocket 客戶端發(fā)送的一個 base64 編碼的密文棵磷,要求服務(wù)端必須返回一個對應(yīng)加/密的“Sec-WebSocket-Accept”應(yīng)答仪媒,否則客戶端會拋出“Error during WebSocket handshake”錯誤算吩,并關(guān)閉連接佃扼。
清單:2.WebSocket 服務(wù)端響應(yīng)報文
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
////“Sec-WebSocket-Accept”的值是服務(wù)端采用與客戶端一致的密鑰計算出來后返回客戶端的,“HTTP/1.1 101 Switching Protocols”表示服務(wù)端接受 WebSocket 協(xié)議的客戶端連接兼耀。
webSocket 客戶端實例
// 創(chuàng)建一個Socket實例?
var socket = new WebSocket('ws://localhost:8080');//服務(wù)器地址
// 打開Socket ??
socket.onopen = function(event) {
// 發(fā)送一個初始化消息
socket.send('I am the client and I\'m listening!');
// 監(jiān)聽消息
socket.onmessage = function(event) {
console.log('Client received a message',event);//???event.data???接收數(shù)據(jù)
};
// 監(jiān)聽Socket的關(guān)閉
socket.onclose = function(event) {
console.log('Client notified socket has closed',event);
};
// 關(guān)閉Socket....
//socket.close()
webSocket 規(guī)范定義了ws和wss兩種url模式巢音,ws 用于非加密連接尽超,wss用于加密連接似谁。