我使用smack构建一个小型XMPP客户端/机器人时会遇到一种非常奇怪的行为。我设置了连接以及ConnectionListener和ChatManagerListener。这很好用,然后我就可以在便携式设备上运行我的应用程序。
为了测试丢失连接的行为,我插上了便携式设备的以太网电缆。我希望XMPP客户端丢失连接,并且用户将在用户好友的名单中设置为“离线”。会发生什么,这个用户仍然显示为“在线”,我的客户端的ConnectionListener什么都不会触发,无论是connectionClosed还是reconnectionFailed,否则。
当我再将以太网电缆插入时,有时它就像连接一直处于活动状态。处理离线消息,我可以像以前一样再次聊天。 其他时候,我的客户完全无法进入并且无序,似乎所有听众都已经离开...但是没有引发任何谴责。
这是一个非常奇怪且无法控制的行为,会使整个客户端无法使用,因为我无法确定客户端是否会在连接后再次出现。
是否有其他人遇到过此类问题或有任何暗示(不)发生的事情?
如果需要,我可以提供我的代码,但它实际上只是复制&从Smack文档中粘贴。
答案 0 :(得分:8)
您实际上是在这里描述两个不同的效果。让我们从你的问题标题中命名的那个开始:服务器在线,即使连接是突然的,因此不干净,中止。原因很简单,服务器还没有注意到客户端断开连接,因为没有干净的XMPP节流终止。大多数XMPP服务器每隔X分钟检查一次ping客户端。如果客户端没有响应,则假定它已断开连接并显示为脱机(如果它是该JID的最后一个连接资源)。这种情况在这里没有发生,并不罕见。因为有时你想要超时(半小时或更长)。
这同样适用于另一方。如果使用PingManager
或PingManagerWithAlarmManager
(对于Android),Smack还会每X分钟发送一次XMPP ping。如果使用的套接字有任何问题,则抛出异常。
我希望我能指出你正确的方向。您必须自己调试为什么在您的情况下连接没有因例外而终止。
最后一件事:即使以太网电缆被拔出然后重新进入,TCP连接也很容易在一些超时时间内存活。在OSI模型的各个层上有很多超时:NAT,TCP,XMPP等。 / p>
答案 1 :(得分:0)
您也明确使用disconnect()
方法终止连接,否则服务器必须定期ping您并意识到您已离线