设备上的XMPP上丢失的消息已断开连接

时间:2012-03-13 18:36:58

标签: android xmpp

我正在尝试开发一种基于XMPP的转弯基础游戏。 (我发现多平台游戏的唯一解决方案)。我可以毫无问题地发送消息。如果其他用户不在线,则服务器(OpenFire)将其保存以供以后交付。

当设备更换网络(从3g更改为WiFi,更改3g IP ...)或设备丢失网络(关闭3g,wifi或连接丢失)时出现问题。服务器认为设备在线并发送消息,但它(很明显)从未到达,因此数据包丢失。

我知道一个解决方案。对我的游戏协议实施ACK,但我不太喜欢这个想法。你还有其他建议吗?我认为这是一个服务器问题。你知道另一个服务器是否实现TCP或ACK?

谢谢!

编辑:我这样做:将设备连接到服务器。我拒绝3G和WiFi连接到设备。 Android和服务器仍然认为连接是活的。

http://issues.igniterealtime.org/browse/SMACK-331

PD:我要求他们为多人游戏api打开,但他们并没有把我当作......

4 个答案:

答案 0 :(得分:1)

虽然BOSH可能会在这种情况下起作用,但另一种选择是XEP-0198:流管理。这样,您就可以完全连接插座的所有性能,以及快速重新连接,正向执行和排队,同时在两个方向上取消或断开连接。

答案 1 :(得分:0)

在某些情况下,TCP / IP不可靠。这就是XMPP中的ACK,消息收据,IQ或其他扩展可以解决这个问题的原因。
多年来,我经常使用Openfire进行大量的移动编程。但我没有看到丢失的消息。因此,我假设您在Android上使用的库或您使用的Openfire版本存在问题。

您也可以使用BOSH代替使用原始套接字:
http://xmpp.org/extensions/xep-0124.html
BOSH基于像Comet这样的WebRequests,在经常切换或松散连接的环境中运行良好。它可以使连接保持活动状态,直到您的网络恢复,并且当一个或多个请求连续失败时不会导致连接丢失。

答案 2 :(得分:0)

我也遇到过这个问题,并试图找到一种解决问题的正确方法。

问题在于我将离线消息策略设置为“始终存储”,因此XEP-0184无法确定消息是否未传送到其接收方。

提供此方案:   - 我有2个用户聊天,称他们为A和B.   - 当B的连接丢失时,A向B发送消息   - 邮件被删除,A未通知   - 在这种情况下,A不知道消息被丢弃,它只是假设消息被传递到服务器,服务器最终将它传递给B   - B永远失去了信息

所以我暂时为此解决了问题...我将所有未送达的消息(即没有收到消息发送收据)存储到队列中,然后定期(例如,6分钟 - 这是那些死连接被擦除的时间)检查队列中的每条消息,看看目标收件人是否“在线”并且收据仍未收到......如果是这种情况,那么我将该邮件标记为“交付失败”

这是解决问题的一种非常糟糕的方法(请告知您是否有更好的方法)。我认为最好的办法是让服务器执行此操作:如果邮件无法传递且离线邮件策略为“始终存储”,则我们将其存储为“ofoffline”以延迟传递。

答案 3 :(得分:0)

这是一个旧的,但我最近解决了这个问题。当我在构建连接时将XMPP资源(完整JID的最后一部分)设置为合理的东西时,它帮助了我。否则,它将在每次重新连接时随机生成 - 并且会更改完整的JID。