java - Smack 客户端 - 尽管连接中止,用户仍然是 'online'

标签 java connection xmpp smack reconnect

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

为了测试失去连接时的行为,我拔掉了可移植设备的以太网电缆。我希望 XMPP 客户端失去连接,并且用户将在用户好友名册中设置为“离线”。发生的情况是,该用户仍然显示为“在线”,而我的客户端的 ConnectionListener 什么也没触发,无论是 connectionClosed 还是 reconnectionFailed 还是其他。

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

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

有没有其他人遇到过此类问题或有任何提示(未)发生什么?

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

最佳答案

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

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

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

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

关于java - Smack 客户端 - 尽管连接中止,用户仍然是 'online',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10835470/

相关文章:

java - Java Swing 中的 Firefox 选项 Pane UX 设计?

java - 使用 JsonTypeInfo.As.EXTERNAL_PROPERTY 而不指定 @JsonSubTypes

java - Actionscript 游戏/程序与他人联系

java - Pircbot,检索完整用户列表时出现问题

ios - 任何人都可以建议我如何获取我的 friend 列表个人资料图片和状态

android - 同一个第 3 方应用程序服务器是否可以同时满足 CCS 和 GCM 的需求,或者我应该创建两个版本的第 3 方应用程序?

java - 如何映射两个类中的所有可用字段(无继承)

java - 无法为接口(interface)实现者创建泛型

c++ - Linux、C++、dup(socket) 是否会从另一个非 fork 进程工作(如果不是如何启用它)?

Grails XMPP 聊天网站