Xmpp Ejabberd服务器不断地让我注销和重新登录

Xmpp Ejabberd服务器不断地让我注销和重新登录,xmpp,ejabberd,Xmpp,Ejabberd,我正在构建一个iOS应用程序,但问题存在于所有客户端上。iChat、消息、Psi等等,因为它存在于所有客户端上,所以我假设这是服务器问题 有人经历过这样的事情吗?如果是这样,你是怎么修复的?我肯定这是一些愚蠢的配置设置或什么的,但我就是不明白这一点。这是ejabberd.log中唯一与此相关的内容: =ERROR REPORT==== 2012-09-05 12:07:12 === Mnesia(ejabberd@localhost): ** WARNING ** Mnesia is overl

我正在构建一个iOS应用程序,但问题存在于所有客户端上。iChat、消息、Psi等等,因为它存在于所有客户端上,所以我假设这是服务器问题

有人经历过这样的事情吗?如果是这样,你是怎么修复的?我肯定这是一些愚蠢的配置设置或什么的,但我就是不明白这一点。这是ejabberd.log中唯一与此相关的内容:

=ERROR REPORT==== 2012-09-05 12:07:12 ===
Mnesia(ejabberd@localhost): ** WARNING ** Mnesia is overloaded: {dump_log,
                                                             time_threshold}
提前感谢您提供的任何提示。

上述警告(可能)与您面临的问题无关。这些通常发生在需要转储事务日志,但上一个事务日志转储尚未完成时

您面临的问题需要进行调试,您可以在
ejabberd.cfg
内部设置
{log\u level,5}
。这将启用ejabberd的调试日志记录。然后查看日志,找出为什么会发生这种情况的猜测。另外,请回来并将您的日志文件详细信息粘贴到此处,我们可能会进一步帮助您。我从来没有和埃贾伯德面对过这样的非理性问题

日志文件附件后更新:

正如Joe在下面所写的,这确实是因为资源冲突。您的两个客户端正在尝试使用相同的资源值登录。但在理想世界中,这并不重要。Jabber服务器应该通过在客户端请求的资源值之上附加或预加自定义值来解决这一问题

例如,以下是gtalk(甚至facebook聊天)服务器的功能:

SENT <iq xmlns="jabber:client" type="set" id="1"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>jaxl#resource</resource></bind></iq>
RCVD <iq id="1" type="result"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>jabberxmpplibrary@gmail.com/jaxl#resou27F46704</jid></bind></iq>
已发送jaxl#资源
RCVDjabberxmpplibrary@gmail.com/jaxl#27F46704
正如您所看到的,我的客户机请求绑定资源值
jaxl#resource
,但gtalk服务器实际上将我的会话绑定到了资源值
jaxl#resource27f46704
。简而言之,这不是客户机中的错误,而是ejabberd中的错误

要解决此问题,您可以做两件事:

  • 资源值可能是在客户端配置中的某个位置硬编码的。简单地去掉这个。一个好的客户机将通过在其末端生成一个随机资源值来自动处理这个问题
  • 修补程序ejabberd,使其能够像gtalk服务器那样工作(如上所示)。这是src中的相关部分,需要进行一些调整。同时在c2s源文件中搜索被新连接替换的
    ,您将了解发生了什么
  • 这听起来像是客户机中的“决斗资源”bug。您可能有两个客户端副本使用同一资源同时运行,并且执行错误的自动重新连接逻辑。当第二个客户端登录时,第一个客户端脱机启动,并出现冲突错误。第一个客户端重新登录,导致第二个客户端出现冲突错误。循环

    这方面的证据在您的日志文件中,第3480行:

    D(<0.373.0>:ejabberd_c2s:1553) : Send XML on stream = 
      <<"<stream:error><conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
           <text xml:lang='en' xmlns='urn:ietf:params:xml:ns:xmpp-streams'>
             Replaced by new connection
           </text>
         </stream:error>">>
    
    D(:ejabberd_c2s:1553):在流上发送XML=
    >
    
    似乎已经修补过了。配置变量名为resource\u conflict,您需要的值是setresource。

    我应该指出,我不知道(上面)的错误是否与问题有关。它正在断开和重新连接,即使我清除了ejabberd.log文件。。。它什么也没有。所以这个问题似乎没有记录任何东西。啊,好主意。我不知道我可以提高日志级别。下面是日志文件:我更改了一些基本信息,如主机名和用户名,但请告诉我是否可以看到密码或任何其他私人信息。我试着看了看,但该死的,它很长,似乎有很多重复的信息。我搜索了“警告”和“错误”,只有错误出现了两个结果(第3480行)。谢谢你的建议!!!!我很感激。谢谢@Abhinav的更新!但我不明白的是为什么我所有的客户都这么做。所以这不仅仅是我在客户机中硬编码的东西。另外,我刚刚安装了ejabberd的一个测试版本(与linux上运行的版本相同),它很好(这让人困惑……linux版本有问题,osx版本没有)。它们不是都使用相同的代码库吗?您使用的客户端是什么?你测试过ejabberd的哪些版本?你能把它们链接到这里吗?看,信息,Psi,我的测试应用程序。2.1.11在两台服务器上。CentOS 6.3版本与Linux 64位安装程序一起安装。OSX Lion是与64位OSX安装程序一起安装的。
    消息-->首选项-->帐户-->选择您的帐户-->聊天设置-->位置
    (默认为“使用我的计算机名”),类似地,您可以在其他客户端中看到硬编码值。就源代码而言,由于您使用的是一个版本,即2.1.11(我以为您安装了不同版本的ejabberd),所以它在任何地方的行为都是一样的。哦,太疯狂了。这是ejabberd的一个已知错误?我想我应该询问它是否已知以及是否有任何已知的修复程序。这不是一个错误,您不能让两个客户端同时连接同一个完整JID。他们必须有不同的资源,因此有不同的完整JID。也就是说,不同的客户机通常会使用不同的资源,例如/pidgin for pidgin。您应该检查在每个客户端中指定了哪些资源。这不是服务器错误。这是一个客户,但几乎每个客户和客户库多年来都有。有趣。那么,如果一个客户端尝试连接多次,它会让每个人都退出服务器并重新登录?对我来说,听起来像是一个服务器错误。如果处理得当,在我看来,它只会注销同一JID的第一个实例。谢谢你的信息,伙计们!