HTML5(十一)——WebSocket 基礎教程

一、為什麼要學 WebSocket?

websocket 是 HTML5 提供的一種長鏈接雙向通訊協議,使得客戶端和伺服器之間的數據交換更簡單,允許服務端主動向客戶端推送數據,並且客戶端與服務端只需連接一次,就可以保持長久連接,並進行數據通訊。

websocket 與 http 區別:

  • http 鏈接分為長鏈接、短鏈接,短鏈接是發送一個請求,返回一個響應,長鏈接是在一定周期內保持鏈接。但是 websocket 只需連接一次就可以保持長鏈接,不需要的時候可以手動斷開。
  • http 通訊中,客戶端是主動的,服務端是被動的。但是 websocket,服務端可以主動向客戶端推送數據。
  • http 通過輪詢建立的長鏈接,多次建立 request / response 會產生冗餘的頭部資訊。

ajax 輪詢與 websocket 通訊原理如圖:

 

HTML5(十一)——WebSocket 基礎教程

 

 

websocket 就是為了解決客戶端發起多個 http 請求到伺服器資源,瀏覽器必須要經過長時間的,輪詢問題而生的,實現多路復用。它最大特點就是伺服器可以主動向客戶端推送資訊。

二、WebSocket 對象

2.1、創建對象:

let ws = new WebSocket( url , [ protocol ] )

url:指定連接的後台服務地址。

protocol:指定可接受的子協議,是可選參數。

2.2、對象屬性

readyState:表示連接狀態,是一個只讀屬性。

使用語法:ws.readyState

返回的值有4個,分別表示的意義:

  • 0 – 未建立連接
  • 1 – 已建立連接,可正常通訊
  • 2 – 連接正在進行關閉
  • 3 – 連接已經關閉或斷開,無法通訊

bufferedAmount:已被放入等待傳輸隊列,但是還沒有發出的 UTF-8 文本位元組數,也是只讀屬性。

2.3、對象事件

onopen – 連接時觸發,用於指定連接成功後的回調函數。

使用語法:

// 方法一 :只可以指定一個回調函數
ws.onopen = function(){

}
//方法二 :可以指定多個回調函數
ws.addEventListener('open',function(){

})

 

onclose – 關閉時觸發,指定連接關閉時回調函數。

使用語法:與 onopen 完全一致。

onmessage – 客戶端接收服務端數據時觸發,指定回調函數。

使用語法:

// 方法一:
ws.inmessage = function(event){
    let data = event.data
  //伺服器傳給客戶端的數據
}
// 方法二:
ws.addEventListener('inmessage', function(event){
    let data = event.data
  //伺服器傳給客戶端的數據
})

 

onerror – 通訊發生錯誤時觸發,並指定回調函數。

使用語法:

//方法一
ws.onerror = function(){
//錯誤處理
}
//方法二
ws.addEventListener('error',function(){
//錯誤處理
})

 

2.3、對象事件

send – 用於向伺服器發送數據。

使用語法:

ws.send( data )

data :是發給伺服器的數據,這個數據可以是字元串、數組、json、Blob 對象或 ArrayBuffer 對象等。

如發送 Blob 對象例子:

var file = document.querySelector('input='file'').files[0]
ws.send(file)

close – 關閉連接

使用語法:

ws.close()
Tags: