客户端与Gateway进行websocket长连接的情况下,
设置了pingInterval=30,pingNotResponseLimit=0,
这种情况下,客户端会稳定连接着,
但如果设置了pingNotResponseLimit > 0,等于1至等于5都试过,
就会在 30 * pingNotResponseLimit时断开链接;
防火墙是关着的,所以不会受防火墙的影响,本以为可能是服务器环境问题,
后来重新搭建了个新的环境,只跑PHP和相关依赖,也同样出现这个情况;
请问下还有什么因素会导致这种情况;例如keepalive?
摘自手册 http://doc2.workerman.net/326139
如果$pingNotResponseLimit>0,客户端必须在$pingInterval*$pingNotResponseLimit秒时间内发送心跳给服务端,不然服务端就认为客户端已经下线,断开链接。
好吧,我忘了补充,客户端是有回心跳包的,并且,客户端是做了双向心跳包,服务器会主动发心跳包,客户端同时也有主动心跳包机制,服务器回回心跳包,但………就是在$pingInterval*$pingNotResponseLimit后断开连接…
可能发的心跳数据不符合服务端的协议
心跳包数据不符合服务端协议???服务端发送的心跳包内容是默认的“{action:ping}”,客户端只要回应服务器应该算是一个ping Ack了,这怎么说??
你可以用chrome浏览器f12 network里选择ws链接,在Frames里看下,客户端到底有没有向服务端发送心跳,时间间隔是否小于服务端设置的pingInterval的值。
@1:客户端读超时,服务器超时时间,nginx读超时设置的都正确,心跳间隔超过60S就有问题,期间websocket连接正常,可以收数据,但是没有心跳数据的发送。试过N次都是断开与客户端的连接,不是我网络环境的问题,因为socket还连着,双方仍然能收到数据,就是不心跳。
我也发生这种问题了,求大神解答!
客户端有回应,我专门在event里面写了一个日志,可以收到客户端回应,但是gateway依然断开连接了!
客户端回应不及时会断开,日志记录下客户端发心跳的时间,看看是否超过gateway的心跳时间限制。
另外改了gateway的配置要restart重启,不然无效