能收到心跳ping, 但收不到其它用户发来的消息

ala

socket服务使用(gatewayWorker3.0.7), gatewatClient3.0.0
 
A跟B分别连接socket地址
 
A无法收到B的消息 , B能收到A的消息
 
A能收到服务端的{"type":"ping"} , 但是 Gateway::isOnline() 返回0,显示不在线。  A必须调用Gateway::bindUid() 绑定ID才能正常接收心跳外的其它消息。   
 
望懂的大佬们指导下,感谢!
 
 
 
 

3017 1 0
1个回答

blogdaren

1、按你所说:A能收到服务端的{"type":"ping"} ,那么你确定是一直都能周期性的收到服务端这个ping吗? 如果是,说明A一直和服务端保持着长连接;同时呢 Gateway::isOnline(A) 返回0 ,说明A已经离线,这也解释了为什么A无法收到B的消息。 所以换句话:这两者是自相矛盾的。
2、应该顺着 Gateway::isOnline(A) 返回0 这条线查找线索, 返回0,说明A已经离线并触发了onClose回调,我能想到的可能原因是: 检查下你的心跳时间设置,比如A在规定的时间内没有发送心跳包被服务端强制干掉了;当然还可能是其他的原因导致A离线,自己查查吧。 

  • ala 2018-10-26

    确定能一直收到{"type":"ping"},我设置的是服务端10秒向客户端发一次。 可就是没法理解为什么Gateway::isOnline(A) 会返回0

  • blogdaren 2018-10-26

    10秒是你服务端主动发送的心跳周期;$gateway->pingInterval 和 $gateway->pingNotResponseLimit 这两个参数你分别配置的是什么?

  • ala 2018-10-26

    @614:$gateway->pingInterval = 10; $gateway->pingNotResponseLimit 没有设置

  • blogdaren 2018-10-26

    哦,那说明心跳层不会引起啥子问题。pingNotResponseLimit 没有设置,默认就是0,这代表客户端发不发送心跳无所谓,服务端不会因为客户端长时间没发送数据而断开连接。 我没有上下文了,你还是自己源码断点跟踪调试吧。

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