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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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咯。
参考技术A 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本身就有心跳内容&功能模块,需要的难点是 心跳维持(断开后 再链接)吧。。本回答被提问者采纳

Java实现高性能WebSocket即时消息服务

即时消息场景:

  1. 聊天室

  2. 即时通知,前端页面消息通知


实现方式:

  1. 短轮询:1或2秒不停的轮询业务接口,短时间不间断轮询

  2. 长轮询:相比于短轮询,这里业务接口实现:如果有数据及时返回, 无数据hold15-20s

  3. 长连接:websocket,当前端和websocket服务open一个连接后, 这个连接是一直保持的,需要维持心跳(ngnix有无心跳断连的机制)

1,2和3的本质区别:


实现技术:

  1. 传统思路是java自带的websocket接口实现

  2. NIO框架之一中netty的websocket(可以自行百度如何接入代码,接入不是很复杂),既然是NEW IO了肯定用新的对吧,新的性能高呀


如何让netty实现海量服务支持:

https://www.cnblogs.com/ruixueyan/p/6382770.html(可以参考这篇博客)


划一划如何做WebSocket服务集群:

  1. 使用redis全局缓存ws连接的user信息

  2. 在分布式的websockt服务间引入MQ等消息中间件

  3. 不引入redis全局存储/MQ服务间消息,基于ip_hash规则, 用户发起ws连接请求, user1 请求到websocket ip1, user2 请求到websocket ip2;需要发送消息时, 实现ip_hash规则算法,定位到user1消息推送websocket ip1,user2消息推送到websocket ip2;动态扩容机器时, ip_hash算法,无感扩容是麻烦。


END


以上是关于websocket client怎样维持心跳,有没有具体的栗子的主要内容,如果未能解决你的问题,请参考以下文章

JAVA实现长连接(含心跳检测)Demo

Java实现高性能WebSocket即时消息服务

基于go-gin框架的web服务框架之websocket(二)

websockets必须有心跳吗?

WebSocket心跳机制

WebSocket 心跳检测和重连机制