Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Smack客户端-用户仍然是';在线';尽管连接已中止_Java_Connection_Xmpp_Smack_Reconnect - Fatal编程技术网

Java Smack客户端-用户仍然是';在线';尽管连接已中止

Java Smack客户端-用户仍然是';在线';尽管连接已中止,java,connection,xmpp,smack,reconnect,Java,Connection,Xmpp,Smack,Reconnect,我在使用smack构建一个小型XMPP客户机/机器人时遇到了一个非常奇怪的行为。我设置了连接以及一个ConnectionListener和一个ChatManagerListener。这工作得很好,然后我可以与运行在便携式设备上的应用程序聊天 为了测试断开连接时的行为,我拔出了便携式设备的以太网电缆。我预计XMPP客户端将失去连接,并且用户将在用户好友名单中设置为“脱机”。发生的情况是,该用户仍然显示为“联机”,并且我的客户端的ConnectionListener不会激发任何东西,无论connec

我在使用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等。

您已经明确使用了
disconnect()
方法来终止您的连接,否则服务器将不得不定期ping您并意识到您已脱机。

感谢您的澄清,他们可能会帮助我。也许我会更有耐心,在再次插入电缆之前等待1-2分钟以上。不管怎样,听众有时不停地收听,有时不收听的问题仍然是个谜。但我想我会就此提出另一个问题。我想补充一点,TCP的这种行为不是一个bug,而是一个很少有人欣赏的伟大特性。不需要重新连接和执行非常昂贵的XMPP流设置,可以节省大量往返。您可能希望操作系统告诉您连接的丢失和恢复,以便您可以检查连接是否存活。如果发生了,就好像什么也没发生一样继续跑,否则就重新连接。XEP-0198重新连接也非常棒。