初探和實現websocket心跳重連

2021-07-23 08:55:31 字數 1534 閱讀 9082

心跳重連緣由

在使用websocket過程中,可能會出現網路斷開的情況,比如信不好,或者網路臨時性關閉,這時候websocket的連線已經斷開,

而瀏覽器不會執行websocket 的 onclose方法,我們無法知道是否斷開連線,也就無法進行重連操作。

如果當前傳送websocket資料到後端,一旦請求超時,onclose便會執行,這時候便可進行繫結好的重連操作。

因此websocket心跳重連就應運而生。

如何實現

在websocket例項化的時候,我們會繫結一些事件:

var ws=new websocket(url);

ws.onclose=function ;

ws.οnerrοr=function ;

ws.onopen=function ;

ws.onmessage=function (event)

如果希望websocket連線一直保持,我們會在close或者error上繫結重新連線方法。

ws.onclose=function  ;

ws.οnerrοr=function ;

這樣一般正常情況下失去連線時,觸發onclose方法,我們就能執行重連了。

那麼針對斷網的情況的心跳重連,怎麼實現呢。

簡單的實現:

var heartcheck=, start: function, this.timeout) } } ws.onopen=function  ;
ws.onmessage=function (event)
如上**,heartcheck 的 reset和start方法主要用來控制心跳的定時。

當onopen也就是連線上時,我們便開始start計時,如果在定時時間範圍內,onmessage獲取到了伺服器的訊息,我們就重置倒計時,

所以在距離上次從伺服器獲取到訊息,閒置60秒之後我們才會心跳檢測,這個檢測時間可以自己根據自身情況設定。

當心跳檢測send執行之後,如果當前websocket是斷開狀態,傳送超時之後,onclose方法便會被執行,重連也執行了。

如此一來,我們的心跳檢測就實現了。

後來,我本想測試websocket超時時間,又發現了一些新的問題

1. 在chrome中,如果心跳檢測 也就是websocket例項執行send之後,15秒內沒傳送到另一接收端,onclose便會執行。那麼超時時間是15秒。

2. 我又開啟了firefox ,firefox在斷網7秒之後,直接執行onclose。說明在firefox中不需要心跳檢測便能自動onclose。

3. 同一**, reconnect方法 在chrome 執行了一次,firefox執行了兩次。當然我們在幾處地方(**邏輯處和websocket事件處)繫結了reconnect,

所以保險起見,我們還是給reconnect方法加上乙個鎖,保證只執行一次

目前來看不同的瀏覽器,有不同的機制,無論瀏覽器websocket自身會不會在斷網情況下執行onclose,加上心跳重連後,已經能保證onclose的正常觸發。

初探和實現websocket心跳重連

心跳重連緣由 在使用websocket過程中,可能會出現網路斷開的情況,比如訊號不好,或者網路臨時性關閉,這時候websocket的連線已經斷開,而瀏覽器不會執行websocket 的 onclose方法,我們無法知道是否斷開連線,也就無法進行重連操作。如果當前傳送websocket資料到後端,一旦...

初探和實現websocket心跳重連

心跳重連緣由 在使用websocket過程中,可能會出現網路斷開的情況,比如訊號不好,或者網路臨時性關閉,這時候websocket的連線已經斷開,而瀏覽器不會執行websocket 的 onclose方法,我們無法知道是否斷開連線,也就無法進行重連操作。如果當前傳送websocket資料到後端,一旦...

WebSocket 和 Golang 實現聊天功能

這個示例應用程式展示了如何使用 websocket,golang 和 jquery 建立乙個簡單的web聊天應用程式。這個示例的源 在 這個示例需要 golang 開發環境。該頁面描述如何安裝開發環境。go get gary.burd.info go websocket chat go websoc...