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