使用tcp协议 ,设备断开后没有触发onClose方法,进行下线,当服务端停止后,才会触发onClose方法 ,跪求大佬解答
http://doc2.workerman.net/heartbeat.html
大佬,没太看懂文档,按照我的理解,是客户端心跳中断后,应该触发onClose ,但是现在只有服务进程彻底断开才会触发onClose
正常的情况客户端断开连接会向服务端发送一个fin包,服务端收到fin包后得知客户端连接断开,则立刻触发onClose事件回调。 但是有些极端情况如客户端掉电、网络关闭、拔网线、路由故障等,这些极端情况客户端无法发送fin包给服务端,服务端便无法知道连接已经断开。如果客户端与服务端定时有心跳数据传输,则会比较及时的发现连接断开,触发onClose事件回调。
以上摘自手册,解释了为什么断电后无法立刻触发onClose。
所以,就是说,断电后会有一个周期,去发现是否断线,然后触发 onClose
正常退出是没问题的,但是设备断电,想通过心跳判断断开,但等了数个周期仍没有触发onClose
设置好 $gateway->pingNotResponseLimit 不为0,然后restart重启GatewayWorker,注意是restart,不是reload。
@1:
已经设置了,心跳设置放在Events文件
在start_gateway.php 里设置
大佬。我没有这个文件,使用的tp框架集成的。
已解决 ,找到问题了,多谢大佬
http://doc2.workerman.net/heartbeat.html
大佬,没太看懂文档,按照我的理解,是客户端心跳中断后,应该触发onClose ,但是现在只有服务进程彻底断开才会触发onClose
正常的情况客户端断开连接会向服务端发送一个fin包,服务端收到fin包后得知客户端连接断开,则立刻触发onClose事件回调。
但是有些极端情况如客户端掉电、网络关闭、拔网线、路由故障等,这些极端情况客户端无法发送fin包给服务端,服务端便无法知道连接已经断开。如果客户端与服务端定时有心跳数据传输,则会比较及时的发现连接断开,触发onClose事件回调。
以上摘自手册,解释了为什么断电后无法立刻触发onClose。
所以,就是说,断电后会有一个周期,去发现是否断线,然后触发 onClose
正常退出是没问题的,但是设备断电,想通过心跳判断断开,但等了数个周期仍没有触发onClose
设置好 $gateway->pingNotResponseLimit 不为0,然后restart重启GatewayWorker,注意是restart,不是reload。
@1:
已经设置了,心跳设置放在Events文件
在start_gateway.php 里设置
大佬。我没有这个文件,使用的tp框架集成的。
已解决 ,找到问题了,多谢大佬