心跳包设置pingNotResponseLimit后,客户端会断开

JoeZing

客户端与Gateway进行websocket长连接的情况下,
设置了pingInterval=30,pingNotResponseLimit=0,

这种情况下,客户端会稳定连接着,

但如果设置了pingNotResponseLimit > 0,等于1至等于5都试过,

就会在 30 * pingNotResponseLimit时断开链接;

防火墙是关着的,所以不会受防火墙的影响,本以为可能是服务器环境问题,
后来重新搭建了个新的环境,只跑PHP和相关依赖,也同样出现这个情况;

请问下还有什么因素会导致这种情况;例如keepalive?

阅读 4818
4个回答

walkor

Gateway::$pingInterval
服务端向客户端发送心跳数据的时间间隔 单位:秒。如果设置为0代表不发送心跳检测
Gateway::$pingNotResponseLimit
客户端连续$pingNotResponseLimit次$pingInterval时间内不回应心跳则断开链接。

摘自手册 http://doc2.workerman.net/326139

如果$pingNotResponseLimit>0,客户端必须在$pingInterval*$pingNotResponseLimit秒时间内发送心跳给服务端,不然服务端就认为客户端已经下线,断开链接。

  • JoeZing 2017-05-27

    好吧,我忘了补充,客户端是有回心跳包的,并且,客户端是做了双向心跳包,服务器会主动发心跳包,客户端同时也有主动心跳包机制,服务器回回心跳包,但………就是在$pingInterval*$pingNotResponseLimit后断开连接…

  • walkor 2017-05-27

    可能发的心跳数据不符合服务端的协议

  • JoeZing 2017-05-28

    心跳包数据不符合服务端协议???服务端发送的心跳包内容是默认的“{action:ping}”,客户端只要回应服务器应该算是一个ping Ack了,这怎么说??

  • walkor 2017-05-28

    你可以用chrome浏览器f12 network里选择ws链接,在Frames里看下,客户端到底有没有向服务端发送心跳,时间间隔是否小于服务端设置的pingInterval的值。

  • spridu 2018-03-20

    @1:客户端读超时,服务器超时时间,nginx读超时设置的都正确,心跳间隔超过60S就有问题,期间websocket连接正常,可以收数据,但是没有心跳数据的发送。试过N次都是断开与客户端的连接,不是我网络环境的问题,因为socket还连着,双方仍然能收到数据,就是不心跳。

124543719

我也发生这种问题了,求大神解答!

  • 暂无评论
124543719

客户端有回应,我专门在event里面写了一个日志,可以收到客户端回应,但是gateway依然断开连接了!

  • 暂无评论
walkor

客户端回应不及时会断开,日志记录下客户端发心跳的时间,看看是否超过gateway的心跳时间限制。
另外改了gateway的配置要restart重启,不然无效

  • 暂无评论