【问题标题】:Smack Client - User is still 'online' although connection abortedSmack 客户端 - 尽管连接中止,但用户仍然“在线”
【发布时间】:2012-06-05 19:41:45
【问题描述】:

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

为了测试失去连接时的行为,我拔掉了便携式设备的以太网电缆。我预计 XMPP 客户端会丢失连接,并且用户将在用户好友名单中设置为“离线”。发生的情况是,该用户仍然显示为“在线”,并且我的客户端的 ConnectionListener 没有触发任何内容,无论是 connectionClosed 还是 reconnectionFailed 或其他。

当我重新插入以太网电缆时,有时就像连接一直处于活动状态一样。处理了离线消息,我可以像以前一样再次聊天。 其他时候,我的客户完全无法访问并且出现故障,似乎所有的听众都走了……但没有抛出任何异常。

这是一种非常奇怪且无法控制的行为,它会使整个客户端对我无法使用,因为我无法确定在中止连接后客户端是否会再次出现。

有没有其他人遇到过这样的问题或有任何提示(没有)发生了什么?

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

【问题讨论】:

    标签: java connection xmpp smack reconnect


    【解决方案1】:

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

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

    我希望我能为您指明正确的方向。您必须自己调试为什么在您的情况下连接不会因异常而终止。

    最后一件事:即使以太网电缆被拔出然后重新插入,TCP 连接也可以很容易地经受住一些超时。在涉及的 OSI 模型的各个层上存在许多超时:NAT、TCP、XMPP 等。

    【讨论】:

    • 感谢您的澄清,他们可能会帮助我。也许我会更有耐心,等待超过 1-2 分钟,然后再重新插入电缆。无论如何,听众的问题有时保持收听,有时不收听仍然是一些谜。但我想我会为此提出另一个问题。
    • 我想补充一点,TCP 的这种行为并不是一个错误,而是一个似乎很少有人欣赏的伟大特性。不需要重新连接并进行相当昂贵的 XMPP 流设置可以为您节省大量往返。您可能希望操作系统告诉您连接的丢失和恢复,以便您可以检查连接是否仍然存在。如果是这样,就好像什么都没发生一样继续运行,否则重新连接。 XEP-0198 重新连接也很棒。
    【解决方案2】:

    你过于明确地使用disconnect()方法来终止你的连接,否则服务器将不得不定期ping你并意识到你已经离线

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-24
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多