上次咱們講過了websocket斷線重連的問題,那麼久會有人提出疑問了,心跳包重連跟斷線重連有什麼區別呢? android
其實這兩個都是爲了達到一個目的,那就是保證當前設備的網絡狀態保持通暢。。。而斷線重連呢,只能保證網絡失去鏈接的時候有效,並不能保證網絡斷開的時候有效。。。這麼說可能就有不少人迷糊了,這二者之間有什麼區別呢?web
其實很簡單哈,至少我是這麼理解的。網絡失去鏈接的時候是你手動關閉網絡或禁用網絡時,這個時候會觸發到websocket中的onclose事件,也就是說他會觸發斷線重連,json
而網絡斷開的時候呢,指的是比較簡單粗暴的方法,例如直接拔網線之類的。。。。而這個時候呢是不會觸發onclose事件的,那這個時候咱們要怎麼辦呢,咱們就須要用到心跳重連了服務器
好啦,說了這麼多,如今咱們直接來看代碼吧。。。。websocket
首先是斷線重連,這個咱們就不說了,若是沒明白的能夠去看我寫的另一篇關於斷線重連的文章,這裏我就很少說了。。。。網絡
那麼咱們重點來說一下心跳包重連socket
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字段,這使得咱們能夠來初始化發送時間this
if (jsonGotData.hasOwnProperty('heartbeat')) { timestampVal = new Date(jsonGotData.heartbeat); return heartbeatLive(webSocket, timestampVal); }
而後是判斷服務端有沒有發送heartbeat字段來判斷是否是在心跳週期以內code
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);
這個心跳函數的功能是怎麼樣的呢,主要的邏輯是將本地的時間與獲取到服務器的心跳時間作一個比較,判斷咱們的心跳階段是否是處於一個「健康期」,若是存在的話,那天然是繼續正常的心跳啦,那若是不正常的話,咱們就要來重連了。。。
而咱們用這個心跳重連的方法呢,就能夠保證某些傻小白把網線給拔了,都不知道問題出在哪裏,這樣就能夠放心地使用咱們的消息推送了,哈哈。。。