通过丢失的连接xmpp丢失消息

我经历了这个问题

XMPP上丢失的设备断开连接

但没有答案。

当由于某些networking问题而导致连接丢失时,服务器不能识别它并继续向断开的接收机发送消息,这些消息永久丢失。

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

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

在ios方面,我正在使用xmppframework

一种方法是在您的服务器上使用高级消息处理 (AMP)。 另一个是在您的客户端上使用消息传递收据 。

前者需要一个支持AMP的服务器实现并且发起客户端必须能够告诉服务器它想要什么样的传送状态报告( 如果传送是不可能的,它就要返回一个错误 )。 请注意,这不是防弹的,因为在目标客户端与服务器失去连接的时刻和服务器机器上的TCP堆栈检测到这一点并告诉服务器有关的窗口之间存在一个窗口:在此窗口期间,所有内容发送到客户端被服务器视为发送好,因为在TCP层没有消息边界的概念,因此如果服务器进程设法将消息节的XML填充到其TCP连接的系统缓冲区中,则认为节被发送 – 一旦TCP堆栈说明连接丢失,它无法知道它的stream的哪些位没有到达接收器。

后者防弹的,因为客户依赖明确的通知接收消息。 这确实会增加讨厌。 作为回报,没有服务器支持这个function是必需的 – 它只在客户端实现。

与XEP-0198一起去享受…

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

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

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

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