1. 程式人生 > >WebSocket簡介

WebSocket簡介

兼容 AD 協議 strong 3.1 傳輸 因此 oob middle

一、什麽是WebSocket  

1.1 WebSocket的概念

  HTTP請求是基於請求響應模式的,客戶端永遠是主動的一方,這種單向請求的特點,註定了如果服務器有連續的狀態變化,客戶端要獲知就非常麻煩。我們只能使用 "輪詢" :每隔一段時候,就發出一個詢問,了解服務器有沒有新的信息。輪詢的效率低,非常浪費資源(因為必須不停連接,或者 HTTP 連接始終打開)。WebSocket 最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向平等對話,屬於 服務器推送技術 的一種。

1.2 WebSocket的特點

  webSocket主要有以下幾個特點:

    (1)建立在 TCP 協議之上,服務器端的實現比較容易。

    (2)與 HTTP 協議有著良好的兼容性。默認端口也是80和443,並且握手階段采用 HTTP 協議,因此握手時不容易屏蔽,能通過各種 HTTP 代理服務器。

    (3)數據格式比較輕量,性能開銷小,通信高效。

    (4)可以發送文本,也可以發送二進制數據。

    (5)沒有同源限制,客戶端可以與任意服務器通信。

    (6)協議標識符是ws(如果加密,則為wss),服務器網址就是 URL。

  WebSocket的工作過程:建立一個 WebSocket 連接,客戶端瀏覽器首先要向服務器發起一個 HTTP 請求,這個請求和通常的 HTTP 請求不同,包含了一些附加頭信息,其中 附加頭信息"Upgrade: WebSocket"

表明這是一個申請協議升級的 HTTP 請求,服務器端解析這些附加的頭信息然後產生應答信息返回給客戶端,客戶端和服務器端的 WebSocket 連接就建立起來了,雙方就可以通過這個連接通道自由的傳遞信息,並且這個連接會持續存在直到客戶端或者服務器端的某一方主動的關閉連接。http和websocket的連接生命周期簡圖如下:

技術分享圖片

二、WebSocket API

3.1 創建 WebSocket 對象。

var Socket = new WebSocket(url, [protocol] );

3.2 WebSocket 的屬性

屬性 描述
Socket.readyState

只讀屬性 readyState

表示連接狀態:

  • 0 - 連接尚未建立。

  • 1 - 連接已建立,可以進行通信。

  • 2 -連接正在進行關閉。

  • 3 - 連接已經關閉或者連接不能打開。

Socket.bufferedAmount

只讀屬性 bufferedAmount

已被 send() 放入正在隊列中等待傳輸,但是還沒有發出的 UTF-8 文本字節數。

3.3 WebSocket 事件

事件事件處理程序描述
open Socket.onopen 連接建立時觸發
message Socket.onmessage 客戶端接收服務端數據時觸發
error Socket.onerror 通信發生錯誤時觸發
close Socket.onclose 連接關閉時觸發

3.4 WebSocket 方法

方法描述
Socket.send()

使用連接發送數據

Socket.close()

關閉連接


三、WebSocket簡單使用

        var ws = new WebSocket("ws://localhost:8080");
                
               ws.onopen = function()
               {
                  // Web Socket 已連接上,使用 send() 方法發送數據
                  ws.send("發送數據");
                  alert("數據發送中...");
               };
                
               ws.onmessage = function (evt) 
               { 
                  var received_msg = evt.data;
                  alert("數據已接收...");
               };
                
               ws.onclose = function()
               { 
                  // 關閉 websocket
                  alert("連接已關閉..."); 
               };

參考文章:

1、http://www.runoob.com/html/html5-websocket.html

2、http://www.ruanyifeng.com/blog/2017/05/websocket.html

WebSocket簡介