谈下openfire心跳包检测的问题

最近在开发即时通讯客户端遇到了一个问题,就是网络正常的情况下,和openfire服务器正常通讯。如果长时间没接到消息,客户端和服务器的连接就会断开。经过测试,发现openfire每三分钟就会ping一次客户端,客户端会pong回应服务端。但是这样ping-pong几次后,发现客户端就接受不到服务器的ping信息了,而服务器发现客户端没pong,就把客户端的会话关闭了。这是上面那个问题的原因。至于为何客户端会接受不到服务器的ping,就是下面要谈的内容了。经过查找资料发现NAT超时是影响tcp寿命的重大因素。以下是由微信开发 团队提供的资料:

谈下openfire心跳包检测的问题_第1张图片

上面的意思是说心跳包间隔时间要小于NAT超时时间,才能防止长连接中断。

因此我把服务器发送心跳包的间隔改为90s一次,果然问题解决了。

当然这个问题不是最优解,比较好的方法可以是客户端采取智能发送心跳包的方式来维持长连接。具体可以参考以下这篇文章:

http://mp.weixin.qq.com/s/ghnmC8709DvnhieQhkLJpA

你可能感兴趣的:(技术分享)