webSocket入門到嘔吐

詩和遠(yuǎn)方~

簡介

  • WebSocket是什么?

WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——允許服務(wù)器主動發(fā)送信息給客戶端。

  • 產(chǎn)生背景

因為 HTTP 協(xié)議有一個缺陷:通信只能由客戶端發(fā)起。
舉例來說,我們想了解今天的天氣,只能是客戶端向服務(wù)器發(fā)出請求,服務(wù)器返回查詢結(jié)果。HTTP 協(xié)議做不到服務(wù)器主動向客戶端推送信息。
這種單向請求的特點,注定了如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時候,就發(fā)出一個詢問,了解服務(wù)器有沒有新的信息。最典型的場景就是聊天室。
輪詢的效率低,非常浪費資源(因為必須不停連接,或者 HTTP 連接始終打開)。因此,工程師們一直在思考,有沒有更好的方法。WebSocket 就是這樣發(fā)明的。

  • 特點
  1. 服務(wù)器可以主動向客戶端推送信息,客戶端也可以主動向服務(wù)器發(fā)送信息,是真正的雙向平等對話,屬于服務(wù)器推送技術(shù)的一種。
  2. 建立在 TCP 協(xié)議之上,服務(wù)器端的實現(xiàn)比較容易。
  3. 與 HTTP 協(xié)議有著良好的兼容性。默認(rèn)端口也是80和443,并且握手階段采用 HTTP 協(xié)議,因此握手時不容易屏蔽,能通過各種 HTTP 代理服務(wù)器。
  4. 數(shù)據(jù)格式比較輕量,性能開銷小,通信高效。
  5. 可以發(fā)送文本,也可以發(fā)送二進(jìn)制數(shù)據(jù)。
  6. 沒有同源限制,客戶端可以與任意服務(wù)器通信。
  7. 協(xié)議標(biāo)識符是ws(如果加密,則為wss),服務(wù)器網(wǎng)址就是 URL。
'ws://10.96.9.50:17653/CVWS'
示例

客戶端的簡單案例

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="content-type" content="text/html" />
    <meta name="author" content="https://www.baidu.com" />
    <title>websocket test</title>
    <script>
        var socket;
        function Connect(){
            try{
               socket=new WebSocket('ws://10.96.9.50:17653/CVWS');
            }catch(e){
                alert('error');
                return;
            }
            socket.onopen = sOpen;
            socket.onerror = sError;
            socket.onmessage= sMessage;
            socket.onclose= sClose;
        }
        function sOpen(){
            alert('connect success!');
        }
        function sError(e){
            alert("error " + e);
        }
        function sMessage(msg){
            alert('server says:' + msg);
        }
        function sClose(e){
            alert("connect closed:" + e.code);
        }
        function Send(){
            socket.send(document.getElementById("msg").value);
        }
        function Close(){
            socket.close();
        }
    </script>
</head>
<body>
<input id="msg" type="text">
<button id="connect" onclick="Connect();">Connect</button>
<button id="send" onclick="Send();">Send</button>
<button id="close" onclick="Close();">Close</button>
</body>
</html>

客戶端的API

  • WebSocket 構(gòu)造函數(shù)

WebSocket 對象作為一個構(gòu)造函數(shù),用于新建 WebSocket 實例。

var ws = new WebSocket('ws://localhost:8080');

執(zhí)行上面語句之后,客戶端就會與服務(wù)器進(jìn)行連接。

實例對象的所有屬性和方法清單,參見這里

  • webSocket.onopen

實例對象的onopen屬性,用于指定連接成功后的回調(diào)函數(shù)。

ws.onopen = function () {
  ws.send('Hello!');
}

如果要指定多個回調(diào)函數(shù),可以使用addEventListener方法。

ws.addEventListener('open', function (event) {
  ws.send('Hello Server!');
});
  • webSocket.onclose

實例對象的onclose屬性,用于指定連接關(guān)閉后的回調(diào)函數(shù)。

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
});
  • webSocket.onmessage

實例對象的onmessage屬性,用于指定收到服務(wù)器數(shù)據(jù)后的回調(diào)函數(shù)。

ws.onmessage = function(event) {
  var data = event.data;
  // 處理數(shù)據(jù)
};

ws.addEventListener("message", function(event) {
  var data = event.data;
  // 處理數(shù)據(jù)
});

聲明:部分內(nèi)容從網(wǎng)絡(luò)獲取,如有侵權(quán)行為,請與作者聯(lián)系,作者將于2日內(nèi)刪除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容