丢失连接丢失消息xmpp

时间:2014-02-04 16:23:14

标签: ios iphone xmpp ejabberd xmppframework

我经历了这个问题

Lost messages over XMPP on device disconnected

但没有答案。

当由于某些网络问题导致连接丢失时,服务器无法识别它并继续向断开的接收器发送消息,这些消息将永久丢失。

我有一个解决方法,我从服务器ping客户端,当客户端断开连接时,服务器能够在10秒后识别它并在队列中保存更多消息,防止它们丢失。

我的问题是可以100%失败保存消息传递是通过使用其他方式实现我知道psi和许多其他xmpp客户端正在这样做。

在ios方面我正在使用xmppframework

3 个答案:

答案 0 :(得分:1)

一种方法是在服务器上使用Advanced Message Processing(AMP);另一个是在你的客户身上使用Message Delivery Receipts

前一个需要启用AMP的服务器实现启动客户端必须能够告诉服务器它想要哪种类型的传递状态报告(它需要an error to be returned if the delivery is not possible)。请注意,这不是防弹,因为在目标客户端失去与服务器的连接之间以及服务器计算机上的TCP堆栈检测到这一点并告诉服务器有关它的那一刻之间有一个窗口:在此窗口期间,所有内容发送到客户端被服务器认为是好的,因为TCP层中没有消息边界的概念,因此如果服务器进程设法将消息节的XML填充到其TCP连接的系统缓冲区中,则认为该节要发送 - 一旦TCP堆栈说连接丢失,它就无法知道其流的哪些位没有到达接收器。

后者 防弹,因为客户端依赖于有关消息接收的显式通知。这确实增加了骚扰。作为回报,不需要服务器支持此功能 - 它仅在客户端中实现。

答案 1 :(得分:0)

选择XEP-0198并享受......

http://xmpp.org/extensions/xep-0198.html

答案 2 :(得分:0)

对于我正在使用的XMPP客户端,使用以下机制:

  • 为项目添加可达性,以便在手机出现连接问题时快速检测到。
  • 使用XEP-0198的修改版本,添加服务器发送的确认。因此,客户端发送消息,服务器确认收据。稍后,接收用户也将确认收据。对于您发送的每条消息,您将获得两个确认,一个来自服务器,另一个来自客户端。当然,这需要在服务器上进行修改。
  • 当应用未连接到XMPP服务器时,邮件会排队。
  • 当应用程序再次登录到XMPP服务器时,应用程序将获取服务器未确认的所有消息并再次发送。

为此,您必须在应用程序中本地存储三种可能状态的消息:“未发送”,“由服务器确认”,“由用户确认”