上次咱们讲过了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);
这个心跳函数的功能是怎么样的呢,主要的逻辑是将本地的时间与获取到服务器的心跳时间作一个比较,判断咱们的心跳阶段是否是处于一个“健康期”,若是存在的话,那天然是继续正常的心跳啦,那若是不正常的话,咱们就要来重连了。。。
而咱们用这个心跳重连的方法呢,就能够保证某些傻小白把网线给拔了,都不知道问题出在哪里,这样就能够放心地使用咱们的消息推送了,哈哈。。。