GatewayWorker服务端触发onclose事件了,但是长连接仍然存在,客户端仍然可以给服务端发消息,相当于客户端是没有断开的。
这里也有我们自己的原因,我们的服务端没有设置心跳超时(当然,客户端每20s发消息给服务端,做心跳消息,而服务端却没给客户端回消息)
我目前的想法是:
1.服务端开启心跳检测机制,60s未收到心跳包则断开连接
2.每当客户端发送心跳包过来时,给客户端回心跳包
3.客户端做断开策略(累计连续三次发送心跳包没有收到回包则客户端主动断开,收到则重置累计次数)
4.在onclose事件中再走一次Gateway::closeClient($client_id),目的在于对主题描述的触发服务端onclose事件的客户端,却未关闭的客户端长连接进行手动清理,旨在保证能够最即时的清理该死链,最快速度保证客户端能够重新重连上来
还想请教下,针对以上方案是否可行
尤其是第四点,在onclose事件中再加一个Gateway::closeClient($client_id),是否会有问题,还请大神帮忙解答一下
服务端触发 onClose后不用调用 Gateway::closeClient($client_id)。
如果触发onClose,但仍然在通讯,那说明触发onClose的连接和通讯的连接不是一个,在onClose和onMesage里记录下日志,把client_id记录下来对比下就知道了。