我正在开发一个包含“消息”的 Android 应用程序,使用 OpenFire 作为 XMPP 服务器并使用 Smack 作为 Android 客户端。 所有功能都正常,但是当用户在线时(你可以在 openfire 的管理面板中看到它的状态),并且网络连接突然断开,它的 session 将被破坏,但用户在服务器上保持在线状态!因此,数据包不会作为离线消息存储在服务器中,即使用户离线也会发送给用户,数据包将会丢失! 我测试了一个 Windows 客户端(Spark),但是当它失去连接时,服务器中的 session 将被破坏并且用户立即变为离线! 我该怎么做才能解决这个问题?
最佳答案
此行为可能是由名为 Stream Management 的 XMPP 功能引入的.
简而言之,此功能允许短暂断开连接的客户端从中断处继续连接,而无需执行与正常连接相关的所有操作(这往往涉及大量资源)。
这对于网络连接不稳定的客户端或在将应用程序置于后台时中断连接的设备(如手机)很有用。
Openfire 实现了这个功能。请注意,正如您所描述的,数据包并没有“丢失”。相反,所有未处理的数据包都将被缓冲,并且当客户端“迟到”重新连接时(超时适用,我认为默认值为 3 分钟),这些数据包将被视为已发送到断开连接的设备。
如果需要,您可以通过将“stream.management.active”属性设置为“false”来禁用此功能(但对于典型设置,您不需要这样做,因为流管理功能有很好的用途) .
关于android - 为什么即使 session 中不存在 SESSION,openfire 的用户仍保持在线状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48866757/