【问题标题】:Lost messages over XMPP on device disconnected设备断开时通过 XMPP 丢失消息
【发布时间】:2012-03-30 04:58:30
【问题描述】:

我正在尝试通过 XMPP 开发一款回合制游戏。 (我为多平台游戏找到的唯一解决方案)。我可以毫无问题地发送消息。如果其他用户不在线,则服务器 (OpenFire) 将其保存以供以后传送。

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

我知道一种解决方案。在我的游戏协议上实现 ACK,但我不太喜欢这个想法。你还有什么建议吗?我认为这是一个服务器问题。你知道另一个服务器女巫实现 TCP 或 ACK 吗?

谢谢!!

编辑:我这样做:将设备连接到服务器。我关闭了设备的 3G 和 WiFi 连接。 Android 和服务器仍然认为连接是有效的。

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

PD:我要求为他们的多人游戏 API openfeint,但他们没有答应我...

【问题讨论】:

  • 哦。我参与了。你可以开发这个吗?
  • 嗨 LeiNaD_87 你找到解决方案了吗?谢谢。
  • 不,我没有。我也停止研究这个问题了。
  • 通过执行 ping 服务器到客户端服务器能够在 10 秒后断开连接,如果可以提供 ping,则将所有消息放入队列中,这是一个可能的解决方案。

标签: android xmpp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,一直在想办法解决这个问题。

    我的问题是我将离线消息策略设置为“始终存储”,因此 XEP-0184 并不能真正帮助确定消息是否没有传递给接收者。

    提供这个场景: - 我有 2 个用户在聊天,叫他们 A 和 B - A 向 B 发送一条消息,而 B 的连接刚刚丢失 - 消息被丢弃并且 A 没有得到通知 - 在这种情况下,A 不知道消息被丢弃了,它只是假设消息已传递到服务器,服务器最终会将其传递给 B - B 永远丢失消息

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

    这是一种非常糟糕的修复方法(如果您有更好的方法,请告知)。我认为最好的办法是让服务器来执行此操作:如果消息传递失败并且离线消息策略是“始终存储”,那么我们将其存储到“离线”以延迟传递。

    【讨论】:

    • 您可能会考虑从答案中删除问题部分,以避免将其标记为“不是答案”
    • 谢谢。我已经删除了问题部分
    【解决方案3】:

    虽然 BOSH 可能会在这种情况下工作,但另一个选项是 XEP-0198:流管理。这将使您拥有完全连接的套接字的所有性能,以及快速重新连接、正确认和在两个方向上未确认或断开连接时排队。

    【讨论】:

      【解决方案4】:

      在某些情况下 TCP/IP 不可靠。这就是 XMPP 中的 ACK、消息回执、IQ 或其他扩展可以解决此问题的原因。

      这些年来,我做了很多移动编程,也经常使用 Openfire。但我没有看到丢失的消息。因此,我假设您在 Android 上使用的库或您使用的 Openfire 版本存在问题。

      除了使用原始套接字,您还可以使用 BOSH:
      http://xmpp.org/extensions/xep-0124.html
      BOSH 基于像 Comet 这样的 WebRequest,并且在您经常切换或断开连接的环境中运行良好。它可以在您的网络恢复之前保持连接处于活动状态,并且不会在一个或多个请求连续失败时导致连接断开。

      【讨论】:

      • 感谢您的回答。我认为 BOSH 对于这种情况不是一个好的解决方案。移动设备可以通过另一个接口/IP连接...
      • 我刚刚在 OpenFire 上测试了 BOSH,结果是一样的。网络接口上丢失的数据包已更改。我在 OF 配置上激活了 BOSH,并将 smack 连接更改为 BOSHConnection。
      • 这取决于您使用的代码库和您的服务器配置。您的服务器必须配置为使会话保持足够长的活动时间,并且您的库必须支持重新发送请求并且不会在网络故障时断开连接。
      猜你喜欢
      • 2014-02-28
      • 1970-01-01
      • 2015-08-17
      • 2019-02-20
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      相关资源
      最近更新 更多