php websocket 心跳包,websocket 心跳包重连
上次我們講過了websocket斷線重連的問題,那么久會有人提出疑問了,心跳包重連跟斷線重連有什么區別呢?
其實這兩個都是為了達到一個目的,那就是保證當前設備的網絡狀態保持通暢。。。而斷線重連呢,只能保證網絡失去連接的時候有效,并不能保證網絡斷開的時候有效。。。這么說可能就有很多人迷糊了,這兩者之間有什么區別呢?
其實很簡單哈,至少我是這么理解的。網絡失去連接的時候是你手動關閉網絡或禁用網絡時,這個時候會觸發到websocket中的onclose事件,也就是說他會觸發斷線重連,
而網絡斷開的時候呢,指的是比較簡單粗暴的方法,例如直接拔網線之類的。。。。而這個時候呢是不會觸發onclose事件的,那這個時候我們要怎么辦呢,我們就需要用到心跳重連了
好啦,說了這么多,現在我們直接來看代碼吧。。。。
首先是斷線重連,這個我們就不說了,如果沒明白的可以去看我寫的另外一篇關于斷線重連的文章,這里我就不多說了。。。。
那么我們重點來講一下心跳包重連
if (jsonGotData.hasOwnProperty('id')) {
timestampVal = new Date(jsonGotData.now_time);
heartbeatLive(webSocket, timestampVal);
}
if (jsonGotData.hasOwnProperty('heartbeat')) {
timestampVal = new Date(jsonGotData.heartbeat);
return heartbeatLive(webSocket, timestampVal);
}
這是在onmessage中收到信息時候的處理,那么我們來具體分析
if (jsonGotData.hasOwnProperty('id')) {
timestampVal = new Date(jsonGotData.now_time);
heartbeatLive(webSocket, timestampVal);
}
首先這里我們是判斷服務端發送的是不是id字段,這使得我們可以來初始化發送時間
if (jsonGotData.hasOwnProperty('heartbeat')) {
timestampVal = new Date(jsonGotData.heartbeat);
return heartbeatLive(webSocket, timestampVal);
}
然后是判斷服務端有沒有發送heartbeat字段來判斷是不是在心跳周期之內
OK,那么來看具體的心跳函數
heartbeatLive = (function(_this) {
return function(conn, nowTime) {
var nowtime, hbt;
nowtime = new Date();
if ((nowTime.add({
minutes: 1
})).isBefore(androidNowtime)) {
clearTimeout(hbt);
return newConnection();
}
return hbt = setTimeout(function() {
return conn.send('heartbeat');
}, 60000);
};
})(this);
這個心跳函數的功能是怎么樣的呢,主要的邏輯是將本地的時間與獲取到服務器的心跳時間做一個比較,判斷我們的心跳階段是不是處于一個“健康期”,如果存在的話,那自然是繼續正常的心跳啦,那如果不正常的話,我們就要來重連了。。。
而我們用這個心跳重連的方法呢,就可以保證某些傻小白把網線給拔了,都不知道問題出在哪里,這樣就可以放心地使用我們的消息推送了,哈哈。。。
來自:http://my.oschina.net/codingBingo/blog/634947
總結
以上是生活随笔為你收集整理的php websocket 心跳包,websocket 心跳包重连的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle访问远程db2,如何在DB2
- 下一篇: 动态规划算法php,php算法学习之动态