由于 openfire 连接丢失而丢失消息
Posted
技术标签:
【中文标题】由于 openfire 连接丢失而丢失消息【英文标题】:Lossing messages due to connection loss through openfire 【发布时间】:2014-08-23 11:00:18 【问题描述】:在移动设备上关闭互联网会直接导致我的聊天应用出现问题。消息不会存储在 openfire 离线表中,因为 Openfire 仍然会在与服务器突然断开连接时在线显示我。当尝试重新登录时,在此期间发送的消息将丢失。
我正在开发一个聊天应用程序,登录到 openfire 后我可以聊天,其他用户可以在线看到我,但问题是如果一个用户失去连接,比如 WIFI 关闭,在这种情况下,Openfire 不会显示我的状态处于离线状态,仍然显示在线,导致消息丢包。
请提供我无法解决的解决方案。
在旁注中,whatsapp 和其他应用程序如何发送消息。他们是在服务器上使用消息存储策略并确认还是我在这里遗漏了什么。
【问题讨论】:
【参考方案1】:客户端和服务器都需要确认消息已发送和传递,例如您向其他人发送消息,您可以在这里做的就是将此消息保存在您的服务器上,从服务器发送此消息到接收者并等待接收者确认消息已送达,一旦你得到确认 - 从服务器中删除消息。
How whatsapp do it?我在 Quora 上找到了 Michael Donohue 的这个答案
Whatsapp 用于存储和转发,WhatsApp 客户端将存储您发送的任何消息,并继续尝试将其发送到 WhatsApp 服务器。当 WhatsApp 移动应用程序连接到聊天服务器时,存储和转发过程会双向进行。客户端将其消息存储中的任何待处理消息发送到服务器,而服务器将所有发往该客户端的累积消息发送到客户端。这个过程是在确认的基础上完成的。这意味着重复发送消息,直到对方确认收到消息。一旦消息被确认,服务器就会丢弃消息 - 没有长期存储。而一旦 ack 到达,客户端将更新 UI 以仔细检查状态,但会保留消息。
【讨论】:
【参考方案2】:在使用 Smack 框架的 android 客户端中,您必须在创建 XMPPTCPConnection 之后和运行 connection.login() 之前禁用 Stream Mananement。
connection.setUseStreamManagement(false);
我遇到了这个问题,用这段代码解决了。
【讨论】:
如果userStreamManagement
设置为 false,那么我们无法在服务器端收到消息 acknowledgement
状态。以上是关于由于 openfire 连接丢失而丢失消息的主要内容,如果未能解决你的问题,请参考以下文章