我正在开发一个包含“Messaging”的Android应用程序,使用OpenFire作为XMPP服务器并使用Smack for android客户端。
所有功能都可以正常工作,但是当用户在线时(因为你可以在openfire的管理面板中看到它的状态),并且网络连接突然断开,它的会话将被破坏,但用户仍然在服务器上保持在线状态!因此,数据包不作为离线消息存储在服务器中,即使用户离线也会发送给用户,数据包将丢失!
我被测试了一个Windows客户端(Spark),但当它的连接丢失时,服务器中的会话将被销毁,用户立即转向OFFLINE!
我该怎么做才能解决这个问题?
答案 0 :(得分:4)
此行为可能是由名为Stream Management的XMPP功能引入的。
简而言之,此功能允许客户端短暂断开连接以从中断处继续,而不会执行与正常连接相关的所有操作(这往往涉及大量资源)。
这对于网络连接不稳定的客户端或将应用程序置于后台时会破坏连接的设备非常有用,例如在手机上。
Openfire实现了这一功能。请注意,正如您所描述的那样,数据包不会“丢失”。相反,所有未处理的数据包都将被缓冲,并且,当客户端“迟到”重新连接时(超时适用,我认为默认值为3分钟),这些数据包将被视为发送到断开连接设备
如果需要,可以通过将“stream.management.active”属性设置为“false”来禁用此功能(但对于典型设置,您不需要此功能,因为流管理功能有很好的用途)
答案 1 :(得分:1)
这是带有keepalive机制的错误。请检查以下内容:
https://issues.igniterealtime.org/browse/OF-963
我与4.2.3版存在相同的问题。切换回4.0.2。报告了版本4.0.3的问题。