当用户遇到错误或与 XMPP 断开连接时重新连接 XMPP

Posted

技术标签:

【中文标题】当用户遇到错误或与 XMPP 断开连接时重新连接 XMPP【英文标题】:Reconnect with XMPP when user is getting error or disconnect from XMPP 【发布时间】:2014-08-12 06:56:28 【问题描述】:

我在XMPP 框架的帮助下实现了一个聊天应用程序。但我收到一个错误,如图所示:

xmpp did receive error:-
Printing description of error:
<stream:error xmlns:stream="http://etherx.jabber.org/streams"><conflict xmlns="urn:ietf:params:xml:ns:xmpp-streams"></conflict><text xmlns="urn:ietf:params:xml:ns:xmpp-streams" lang="">Replaced by new connection</text></stream>

需要有关可能导致此错误的原因以及如何使用 XMPP 重新连接的指导。

谢谢。

【问题讨论】:

收到此错误时 您已被服务器断开连接,因为另一个客户端使用与您相同的资源连接到您的帐户。 “资源”是连接到帐户的每个会话的唯一标识符。 【参考方案1】:

使用 XMPPReconnect 类..

@property (nonatomic, readonly) XMPPReconnect *xmppReconnect;

self.xmppReconnect = [[XMPPReconnect alloc] init];
[self.xmppReconnect activate:self.xmppStream];
[self.xmppReconnect addDelegate:self delegateQueue:dispatch_get_main_queue()];

并实现“XMPPReconnect”委托方法

- (void)xmppReconnect:(XMPPReconnect *)sender didDetectAccidentalDisconnect:(SCNetworkReachabilityFlags)connectionFlags

    NSLog(@"didDetectAccidentalDisconnect:%u",connectionFlags);

- (BOOL)xmppReconnect:(XMPPReconnect *)sender shouldAttemptAutoReconnect:(SCNetworkReachabilityFlags)reachabilityFlags

    NSLog(@"shouldAttemptAutoReconnect:%u",reachabilityFlags);
    return YES;

【讨论】:

【参考方案2】:

我相信当客户端从服务器收到此错误时,XMPPReconnect 会停止工作。检查 XMPPReconnect.m。您将在委托函数中看到,当收到此错误时,变量 shouldReconnect 设置为 NO,这意味着不会再尝试重新连接。

解释是当另一个客户端使用相同的资源连接时,“通常”会收到此错误,因此禁用 XMPPReconnect 以避免两个不同客户端和服务器之间的重新连接和断开连接的无限循环。

但是,我注意到即使只连接了一个客户端,有时也会出现此错误。因此,如果您确定不会有两个不同的客户端同时尝试连接到服务器,我建议将行设置 shouldReconnect 注释为 NO,从而允许 XMPPFramework 将其视为普通断开连接。

【讨论】:

以上是关于当用户遇到错误或与 XMPP 断开连接时重新连接 XMPP的主要内容,如果未能解决你的问题,请参考以下文章

当用户同一用户多次登录时,strophe.js 不调用断开连接

iOS:客户端如何重新连接到 xmpp 服务器

Android基于XMPP Smack Openfire下学习开发IM连接断开重连

断开连接/错误时清除 socket.io 缓冲区

当蓝牙断开连接或重新连接时,我的webview会重新加载

XMPP 注销(Smack API),无需断开与服务器的连接