不知道什么原因触发Onclose

freely

bug描述

客户端所在设备IP切换后(网络会每隔几天会IP变化),会与服务端断开连接,触发了OnClose事件。断开后,设置了2-3秒重新连接,也连接成功了,并且正常工作了。
但是,重连成功后,服务端有时会触发某些连接的Onclose给部分设备客户端。导致客户端又反复断开连接。并且重连成功后,过个300多秒后又会触发Onclose
客户端重新成功后是有启动心跳发送的,服务端也有收到心跳数据的。
但是就是会有一些设备会触发OnClose,跟踪触发OnClose的连接发现,执行OnClose的对应ClientId好像是上次连接的Clinet_id连接。
不知是啥原因造成的,要如何调试呢?

期待的结果及实际结果

重现bug的步骤

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

WorkerMan4.0.19+gateway-worker+TP5

607 2 0
2个回答

six

”服务端有时会触发某些连接的Onclose给部分设备客户端。导致客户端又反复断开连接“

服务端触发某些连接的Onclose为什么会导致客户端断开连接?你是在服务端onClose里添加了关闭客户端的逻辑?

  • 暂无评论
six

像手册说的,客户端切换ip这种属于极端断网情况,客户端可以及时监测到连接断开,服务端因为收不到fin包无法及时监测连接已经断开(和语言、框架无关,这是tcp的机制)。
所以你的情况应该是ip切换后客户端2秒后重连,但是服务端因为监测不到认为旧连接还存活,直到等了300秒后才发现旧连接断开(猜测300秒可能和你心跳配置有关)。如果你在服务端onClose里执行了关闭当前设备所有连接的类似操作,那就会导致300秒后,重连的设备被断开。所以这个属于业务逻辑问题。

  • freely 2023-01-03

    服务端触发OnClose不就是与客户端断开连接吗?这个不是会自动关闭对应的连接吗?我在OnClose里只是做了下线的状态设置而以,当服务端触发OnClose后(这时这个连接应该会从服务端的连接池里去掉了吧),对应的客户端就会自动断开连接了,然后延迟2秒后就触发重连操作。按理说重连成功后与服务端建立的是新的连接的。旧的连接应该是自动就不存在了才对吧。当出现问题时,不是所有设备客户端都会出现这样的。很奇怪。

  • six 2023-01-03

    https://www.workerman.net/doc/gateway-worker/heartbeat.html 这里有手册
    根据tcp机制,客户端切换ip这种情况服务端无法及时检测到连接已经断开,所以会延迟,架设你这里延迟了300秒。那么就会有这种情况:
    设备换ip后本地网络立刻断开,设备在2秒后重连成功,这时设备在服务端存在2个连接句柄,一个是刚刚重连的连接,一个是死连接。300秒后服务端检测到了死连接执行了onClose,这就是为啥onClose的时候对应的client_id是旧的client_id。

    极端换ip断网这种服务端没办法及时检测到,所以会存在服务端一侧旧连接和新连接都同时存在的情况。

  • freely 2023-01-09

    谢谢大佬解答,那这种如何避免出现这样的情况呢,在业务上如何做调整呢?

年代过于久远,无法发表回答
🔝