第一部分 介紹
HTTP的缺點在于通信只能由客戶端發起,如果服務器有連續的狀態變化,客戶端要獲知就非常的麻煩,只能夠使用輪訓的方法,很消耗服務器資源。
WebSocket很好的解決了HTTP的這個缺點,它的特點是服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,屬于服務器推送技術的一種。
特點有 :
- 數據格式輕量,性能開銷小,通信高校。
- 可以發送文本或二進制數據。
- 沒有同源限制,客戶端可以與任意服務器通訊。
- 協議標識是ws,如果加密就是wss,服務器網址就是url。
- 默認端口也是80和443,握手階段采用HTTP協議,能通過各種HTTP代理服務器。
ws://example.com:80/some/path
第二部分 客戶端示例
var ws = new WebSocket("wss://echo.websocket.org");ws.onopen = function(evt) { console.log("Connection open ..."); ws.send("Hello WebSockets!");};ws.onmessage = function(evt) { console.log( "Received Message: " + evt.data); ws.close();};ws.onclose = function(evt) { console.log("Connection closed.");};
第三部分 客戶端API
- WebSocket構造函數var ws = new WebSocket('ws://localhost:8080');
2.WebSocket.readyState 返回示例對象的當前狀態,有四種
CONNECTING:值為0,表示正在連接。
OPEN:值為1,表示連接成功,可以通信了。
CLOSING:值為2,表示連接正在關閉。
CLOSED:值為3,表示連接已經關閉,或者打開連接失敗。
3.WebSocket.onopen 實例對象的onopen屬性,用于指定連接成功后的回調函數
ws.onopen = function () { ws.send('Hello Server!');}
WebSocket.onclose 實例對象的onclose屬性,用于指定連接關閉后的回調函數
ws.onclose = function(event) { var code = event.code; var reason = event.reason; var wasClean = event.wasClean; // handle close event};ws.addEventListener("close", function(event) { var code = event.code; var reason = event.reason; var wasClean = event.wasClean; // handle close event});
5.WebSocket.onmessage 實例對象的onmessage屬性,用于指定收到服務器數據后的回調函數
注意,服務器數據可能是文本也可能是二進制,要不同處理
ws.onmessage = function(event){ if(typeof event.data === String) { console.log("Received data string"); } if(event.data instanceof ArrayBuffer){ var buffer = event.data; console.log("Received arraybuffer"); }}
6.WebSocket.send() 實例對象的send方法用于向服務器發送數據
ws.send('your message');
7.WebSocket.bufferedAmount 實例對象的bufferedAmount屬性,表示還有多少字節的二進制數據沒有發送出去,常用語判斷發送是否結束
var data = new ArrayBuffer(10000000);socket.send(data);if (socket.bufferedAmount === 0) { // 發送完畢} else { // 發送還沒結束}
8.WebSocket.onerror 實例對象onerror屬性,用于指定報錯時的回調函數
socket.onerror = function(event) { // handle error event};socket.addEventListener("error", function(event) { // handle error event});