关于杀死APP断开连接,没有触发onClose,但是又莫名其妙好了的困扰

问题描述

在未做任何代码变更的情况下,出现了断开连接无法触发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
截图
截图

操作系统环境及workerman/webman等具体版本

770 5 0
5个回答

PHP武汉小老弟

中途重启过多次php start.php restart,一直没好,在某一次测试的时候突然就好了,后续都好了,所以不知道跟重启有没有关系,很困扰,害怕再次出现,代码改动只增加了var_dump作为调试

  • a178251115 2023-05-16

    心跳就是这样的,比如你心跳4秒,刚好再第4秒的时候杀死app 了,哪你可能要等8秒才能由心跳断开链接,同理:30秒一个道理

  • a178251115 2023-05-16

    还有就是你可能再快心跳的时候杀了app,所以下一秒心跳就给你断开了,你感觉很快,找个逻辑没有问题,你要马上触发,只有改心跳时间,越短越快

  • PHP武汉小老弟 2023-05-16

    我表述不清,心跳断开链接我明白,但是心跳是在断网等情况下才用心跳检测健全,像我这种杀死应用应该是能马上捕捉到socket连接断开才对(之前都是的,现在出现了不能捕捉到连接断开,应该是能捕捉到断开连接的什么fan包的)

  • a178251115 2023-05-16

    杀死引用,你程序都没了,凭什么主动触发onclose 回调?

  • PHP武汉小老弟 2023-05-16

    杀死应用,正常服务端是能马上触发onclose回调的

  • a178251115 2023-05-16

    难的理你,你都杀死应用了,啥玩意去回调啊?用屁股想都知道不可能啊,都能回调还要什么心跳

PHP武汉小老弟

我发现了造成的原因,无意间试出来的,当我开着移动网络和wifi的时候,我频繁的开关wifi,然后就会导致后面的onclose都要等心跳检测才会触发,不知道什么原因

a178251115

你纠结找个onclose 意义不大,自己后端代码判断清楚就行了,防止一个app 重复建立多次链接就行

  • 暂无评论
nitron

Kill掉应用不会主动触发或者说立即服务器的onClose,因为服务器不知道

  • 暂无评论
PHP武汉小老弟

@@walkor 为什么我两台手机,一台手机杀死APP能马上触发onClose(心跳4秒,经过多次测试都是杀死应用瞬间触发onClose,非巧合),另外一台手机用同样的方式杀死APP,却不会瞬间触发onClose,必须等到心跳检测才触发。

  • PHP武汉小老弟 2023-05-17

    说个不可理解的现象,就是多次测试得出一个现象:杀死应用瞬间触发onClose的那台手机处于充电状态,如果拔掉充电,则再测试不会瞬间触发onClose

  • walkor 2023-05-17

    这个不是服务端问题,是否及时触发onClose取决于手机端在杀死app时是否及时发送了fin包给服务端。没发送fin包就只能依赖心跳检测延迟触发onclose。至于手机什么情况下发fin包取决于手机操作系统的实现。

🔝