在使用websocket的過程中,有時候會遇到客戶端網路關閉的情況,而這時候在服務端並沒有觸發onclose事件。這樣會:
所以就需要一種機制來檢測客戶端和服務端是否處於正常連線的狀態。這就是websocket心跳,這個名字非常生動形象,還有心跳說明還活著(保持正常連線),沒有心跳說明已經掛掉了(連線斷開了)。
我的**主要解決了以下幾個問題。
連線上之後,每秒傳送乙個心跳,伺服器同樣返回乙個心跳,用來表示伺服器沒掛。
斷線重連(我們測試的環境是斷開網路連線),斷開網路後,心跳包無法傳送出去,所以如果當前時間距離上次成功心跳的時間超過20秒,說明連線已經出現問題了,此時需要關閉連線。
第一次關閉連線時websocket會嘗試重連,設定了乙個時間期限,10秒。10秒內如果能連上(恢復網路連線)就可以繼續收發訊息,連不上就關閉了,並且不會重連。
30秒內收不到伺服器訊息(心跳每秒傳送),我就認為伺服器已經掛了,就會呼叫close事件,然後進入第3步。
開始考慮得不周到,命名不規範。
我是在react中使用websocket心跳的。當使用者登入時我會建立websocket連線。由於使用了redux,所以該部分**放在componentwillreceiveprops
中。
componentwillreceiveprops(nextprops) /$`);
ws.last_health_time = -1; // 上一次心跳時間
ws.keepalive = function() else }}
if(ws) )
ws.onopen = () => , 30000); // 30s沒收到資訊,代表伺服器出問題了,關閉連線。如果收到訊息了,重置該定時器。
if(ws.readystate === 1) , 1000)}}
ws.onerror = () =>
ws.onmessage = (msg) => ;
if(msg && msg.senderuserid && !chatobj[msg.senderuserid]) chatobj[msg.senderuserid] = ;
if(msg.content !== 'h&b') >
, ...chatobj[msg.senderuserid]]
chatobj[msg.senderuserid].unshift(msg.content);
windownotificationutils.notice(msg.title, msg.content, () => = this.props;
history.replace(` // 為什麼放在url,因為重新整理頁面資料不會掉
});})
localstorage.setitem
(chatobject, json.stringify(chatobj));
this.props.dispatch
() } else }*/
// 收到訊息,重置定時器
cleartimeout
(ws.receivemessagetimer);
ws.receivemessagetimer = settimeout
(() => , 30000); // 30s沒收到資訊,代表伺服器出問題了,關閉連線。
}ws.onclose = () =>
let tempws = ws; // 儲存ws物件
if(new date().gettime() - reconnect >= 10000) else /$`);
ws.onopen = tempws.onopen;
ws.onmessage = tempws.onmessage;
ws.onerror = tempws.onerror;
ws.onclose = tempws.onclose;
ws.keepalive = tempws.keepalive;
ws.last_health_time = -1;}}
}}}
實現websocket心跳重連
var userid userid val var lockreconnect false 避免ws重複連線 var ws null 判斷當前瀏覽器是否支援websocket var wsurl serverconfig.cyberhouse ws userid createwebsocket ws...
Websocket心跳重連
websocket心跳重連 最近的工作業務上有用到關於websocket的相關知識,本來打算用socket.io去完成,但是最後還是採用了自帶的websocket的方式完成需求 this.websocket.binarytype arraybuffer 現在想象一下有這麼乙個場景,如果網路狀態不佳,...
websocket 心跳重連
websocket是什麼 websocket作用是來做訊息的實時推送 websocket的基本事件有onopen onmessage onerror onclose這四個事件,onopen是連線已開啟,且可以通訊,onmessage是收到訊息,onerror是websocket發生錯誤,onclos...