繁体   English   中英

Smack客户端 - 尽管连接中止,用户仍处于“在线”状态

[英]Smack Client - User is still 'online' although connection aborted

我使用smack构建一个小型XMPP客户端/机器人时遇到了一种非常奇怪的行为。 我设置了连接以及ConnectionListener和ChatManagerListener。 这很好用,然后我可以与我在便携式设备上运行的应用程序聊天。

为了测试丢失连接的行为,我插上了便携式设备的以太网电缆。 我希望XMPP客户端丢失连接,并且用户将在用户好友的名单中设置为“离线”。 会发生什么,该用户仍显示为“在线”,而我的客户端的ConnectionListener不会触发任何内容,无论是connectionClosed还是reconnectionFailed,否则。

当我再将以太网电缆插入时,有时它就像连接一直存在。 处理离线消息,我可以像以前一样再次聊天。 其他时候我的客户完全无法访问并且无序,似乎所有的听众都已经消失......但是没有引发任何激励。

这是一个非常奇怪和无法控制的行为,会使整个客户端无法使用,因为我无法确定客户端是否会在连接被取消后再次出现。

有没有其他人遇到过这样的问题或有任何暗示(不)发生的事情?

如果需要,我可以提供我的代码,但它实际上只是从Smack文档中复制和粘贴。

你实际上在这里描述了两种不同的效果。 让我们从您的问题标题中命名的那个开始:即使连接是突然的,因此服务器在线假设用户,因此不干净,中止。 原因很简单,服务器还没有注意到客户端断开连接,因为没有干净的XMPP节流终止。 大多数XMPP服务器每隔X分钟检查一次ping客户端。 如果客户端没有响应,则假定它已断开连接并显示为脱机(如果它是该JID的最后一个连接资源)。 这种情况在这里没有发生,并不罕见。 因为有时你想要超时(半小时或更长)。

这同样适用于另一方。 如果使用PingManagerPingManagerWithAlarmManager (适用于Android),Smack还会每X分钟发送一次XMPP ping。 如果使用的套接字有任何问题,则抛出异常。

我希望我能指出你正确的方向。 您必须自己调试为什么在您的情况下连接没有因例外而终止。

最后一件事:即使以太网电缆被拔出然后重新进入,TCP连接也很容易在一些超时时间内存活。在OSI模型的各个层上有很多超时:NAT,TCP,XMPP等。

您也明确使用disconnect()方法终止连接,否则服务器必须定期ping您并意识到您已脱机

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM