通过丢失的连接xmpp丢失消息
我经历了这个问题
XMPP上丢失的设备断开连接
但没有答案。
当由于某些networking问题而导致连接丢失时,服务器不能识别它并继续向断开的接收机发送消息,这些消息永久丢失。
我有一个解决方法,我从服务器ping客户端,当客户端断开连接时,服务器能够在10秒后识别它,并将更多消息保存在队列中,防止它们丢失。
我的问题是可以100%失败保存消息传递可以通过使用其他方式来实现,我知道psi和许多其他xmpp客户端正在这样做。
在ios方面,我正在使用xmppframework
一种方法是在您的服务器上使用高级消息处理 (AMP)。 另一个是在您的客户端上使用消息传递收据 。
前者需要一个支持AMP的服务器实现,并且发起客户端必须能够告诉服务器它想要什么样的传送状态报告( 如果传送是不可能的,它就要返回一个错误 )。 请注意,这不是防弹的,因为在目标客户端与服务器失去连接的时刻和服务器机器上的TCP堆栈检测到这一点并告诉服务器有关的窗口之间存在一个窗口:在此窗口期间,所有内容发送到客户端被服务器视为发送好,因为在TCP层没有消息边界的概念,因此如果服务器进程设法将消息节的XML填充到其TCP连接的系统缓冲区中,则认为节被发送 – 一旦TCP堆栈说明连接丢失,它无法知道它的stream的哪些位没有到达接收器。
后者是防弹的,因为客户依赖明确的通知接收消息。 这确实会增加讨厌。 作为回报,没有服务器支持这个function是必需的 – 它只在客户端实现。
与XEP-0198一起去享受…
对于我正在使用的XMPP客户端,使用以下机制:
- 为项目添加可达性,在手机遇到连接问题时快速检测。
- 使用XEP-0198的修改版本,添加由服务器发送的确认。 所以,客户端发送一个消息,服务器确认收据。 稍后,接收用户也将收到确认。 对于您发送的每条消息,您都会得到两个确认,一个来自服务器,另一个来自客户端。 这当然需要在服务器上进行修改。
- 当应用程序未连接到XMPP服务器时,消息排队。
- 当应用程序再次login到XMPP服务器时,应用程序将获取所有未被服务器确认的消息并再次发送。
为此,您必须在应用程序中以三种可能的状态在本地存储消息:“未发送”,“由服务器确认”,“由用户确认”