websocket client怎样维持心跳,有没有具体的栗子

如题所述

websocket是个很优秀的工具,网络上很多例子不适合,也不合乎逻辑,是发送心跳包不错,但是如何通过发送心跳包判断是否断开,这个大家说法不一样,99%的言论说是判断有没有接收到客户端反馈,有没有接收到服务端反馈。如果你这么想,你的程序就会不间断的掉线,实际上他没掉线。
自己下载一个360流量监测工具,或者用调试窗口看流量消息,程序就让timer一直发数据包。你会发现他发送有规律,接收数据是没有时间规律,有时候反应快点就很快 接收了,有时候反应慢了(很多未知因素可能来自操作系统)那就迟点接收咯。你如果规律型的去判断有没有接收到数据,那就很有可能误判,而且这个可能性是100%。最后你会发现你的逻辑不间断性掉线,甚至你会怀疑是websocket的问题。
其实websocket通信就像打电话,我打对方接才算通,对方挂断我自然在手机上看到断开了,都没办法把话说出去,心跳包就是保持通话,你不说话了不代表就断开了,你说了对方没回应也不代表就挂断了。webScocket有个事件叫OnError,都不知道用来干嘛的,我看很少有人使用过,这个就是挂断了话都说不出去触发的。
前段时间看网络上说腾讯应提问socket服务端会及时感知客户端断开吗?都是说不行,其实可以,服务端在每秒发送心跳包,发送报错就表示断开了。触发了OnError事件就让用户列表下线,客户端也能立即感知,timer判断socket.state,他一直是open就是在线的,不是就断开了。怎样维持心跳的思路我说清楚了,大概实现就是这样:
onOpen客户端接入,在这个事件发送一个命令,通知他服务端已经接通,让他汇报自己的信息包括用户称呼之类的,客户端接到通知,发送消息汇报自己,服务端onMessage接收到汇报更新用户列表。onClose也是要客户端关闭socket,服务端触发才能下线。还有一个onError事件怎么用?服务端timer定时发送一个数据,发送不出去自然就触发了onError,T用户下线。
客户端就计时器一直判断socket.state咯。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-09-06
function keepalive( ws ){
var time = new Date();
if( last_health != -1 && ( time.getTime() - last_health > health_timeout ) ){
//此时即可以认为连接断开,可设置重连或者关闭连接
$("#keeplive_box").html( "服务器没有响应." ).css({"color":"red"});
//ws.close();
}
else{
$("#keeplive_box").html( "连接正常" ).css({"color":"green"});
if( ws.bufferedAmount == 0 ){
ws.send( '~H#C~' );
}
}

websocket本身就有心跳内容&功能模块,需要的难点是 心跳维持(断开后 再链接)吧。。本回答被提问者采纳
相似回答