在未做任何代码变更的情况下,出现了断开连接无法触发onClose的情况,过了1个多小时又好了
流程如下:
1.杀死APP,过了大概9秒才出现onclose的调用(测试结果证实是由心跳触发,心跳检测为4秒的时候8、9秒触发onclose,设置为30秒的时候大概一分钟触发onclose),反复测试都是这个结果
2.经过多次重启之后还是只能由心跳触发onclose,问题没有解决
3.在只是调整日志打印的代码情况下,又突然好了,能够在杀死app的时候马上触发onclose了,不知道为什么
4.测试方法:tail -f -n 100 stdout.log,然后将APP不停的打开再杀掉,在某段时间里,都不能直接触发onclose
中途重启过多次php start.php restart,一直没好,在某一次测试的时候突然就好了,后续都好了,所以不知道跟重启有没有关系,很困扰,害怕再次出现,代码改动只增加了var_dump作为调试
心跳就是这样的,比如你心跳4秒,刚好再第4秒的时候杀死app 了,哪你可能要等8秒才能由心跳断开链接,同理:30秒一个道理
还有就是你可能再快心跳的时候杀了app,所以下一秒心跳就给你断开了,你感觉很快,找个逻辑没有问题,你要马上触发,只有改心跳时间,越短越快
我表述不清,心跳断开链接我明白,但是心跳是在断网等情况下才用心跳检测健全,像我这种杀死应用应该是能马上捕捉到socket连接断开才对(之前都是的,现在出现了不能捕捉到连接断开,应该是能捕捉到断开连接的什么fan包的)
杀死引用,你程序都没了,凭什么主动触发onclose 回调?
杀死应用,正常服务端是能马上触发onclose回调的
难的理你,你都杀死应用了,啥玩意去回调啊?用屁股想都知道不可能啊,都能回调还要什么心跳
我发现了造成的原因,无意间试出来的,当我开着移动网络和wifi的时候,我频繁的开关wifi,然后就会导致后面的onclose都要等心跳检测才会触发,不知道什么原因
30元有偿求答
不是你断网了,服务端就马上知道,这种只能等心跳去检测,这就需要加心跳的原因
断网这种心跳检测才能检测到
没有断网,我后面也没有频繁切换网络,一直开着网络,只是杀死APP
切换网络或者关闭wifi就是一种断网
后续没切换也没断网。
你纠结找个onclose 意义不大,自己后端代码判断清楚就行了,防止一个app 重复建立多次链接就行
Kill掉应用不会主动触发或者说立即服务器的onClose,因为服务器不知道
@@walkor 为什么我两台手机,一台手机杀死APP能马上触发onClose(心跳4秒,经过多次测试都是杀死应用瞬间触发onClose,非巧合),另外一台手机用同样的方式杀死APP,却不会瞬间触发onClose,必须等到心跳检测才触发。
说个不可理解的现象,就是多次测试得出一个现象:杀死应用瞬间触发onClose的那台手机处于充电状态,如果拔掉充电,则再测试不会瞬间触发onClose
这个不是服务端问题,是否及时触发onClose取决于手机端在杀死app时是否及时发送了fin包给服务端。没发送fin包就只能依赖心跳检测延迟触发onclose。至于手机什么情况下发fin包取决于手机操作系统的实现。