为什么即使会话中不存在 SESSION,openfire 的用户仍保持在线状态

Why the openfire's user remains ONLINE even with no SESSION exists in sessions

我正在开发一个 android 应用程序,其中包含 "Messaging" 使用 OpenFire 作为 XMPP 服务器并使用 Smack 作为 android 客户端。 所有功能都正常,但是当用户在线时(你可以在 openfire 的管理面板中看到它的状态),并且网络连接突然断开,它的会话将被破坏,但用户在服务器上保持在线状态!因此,数据包不会作为离线消息存储在服务器中,即使用户离线也会发送给用户,数据包将会丢失! 我测试了一个 windows 客户端 (Spark),但是当它失去连接时,服务器中的会话将被破坏并且用户立即变为离线状态! 我该怎么做才能解决这个问题?

此行为可能是由名为 Stream Management 的 XMPP 功能引入的。

简而言之,此功能允许短暂断开连接的客户端从中断处继续连接,而无需执行与正常连接相关的所有操作(这往往会涉及大量资源)。

这对于网络连接不稳定的客户端或将应用程序置于后台时中断连接的设备(如手机)很有用。

Openfire 实现了这个功能。请注意,正如您所描述的那样,数据包不是 'lost'。相反,所有未处理的数据包都将被缓冲,并且当客户端 'to late' 重新连接时(超时适用,我认为默认值为 3 分钟),这些数据包将被视为已发送到断开连接的设备。

如果需要,您可以通过将 'stream.management.active' 属性 设置为 'false' 来禁用此功能(但对于典型设置,您不希望这样做,因为流管理功能有很好的用途)。

这是keepalive机制的bug。请检查:

https://issues.igniterealtime.org/browse/OF-963

我在使用 4.2.3 版时遇到了同样的问题。切换回 4.0.2。版本 4.0.3 报告了问题。