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