XMPP4r僵尸程序存在 - 随机出现离线直到重启?

时间:2011-06-06 14:24:14

标签: ruby xmpp xmpp4r

我有一些使用XMPP4r构建的机器人,我看到一个奇怪的问题,它们会在线上一段时间后显示为脱机。 (没有设定的时间)

一天晚上我会在名单上看到他们很好,第二天早上我会在第二天早上醒来,发现他们出现在线下。我可以向他们发送消息,他们回复得很好,他们只是显示离线。

如果我重新开始,他们会立即再次出现在我的名册中。这种情况发生在多个XMPP客户端(iChat,Adium,Meebo)和多个独立的机器人中,因此我认为这不是侥幸。

关于我应该从哪里开始寻找的任何建议?我正在运行自己的Prosody服务器,所以我知道它不是重启。这可能是一个无声的重新连接问题吗?

1 个答案:

答案 0 :(得分:1)

突然间我们友好的jabber bot命名为Bender停止工作,我发现主要问题是服务器发送如下ping:

<iq from='capulet.lit' to='juliet@capulet.lit/balcony' id='s2c1' type='get'>
  <ping xmlns='urn:xmpp:ping'/>
</iq>

客户应该这样回应:

<iq from='juliet@capulet.lit/balcony' to='capulet.lit' id='s2c1' type='result'/>

http://xmpp.org/extensions/xep-0199.html#s2c

的更多信息

当我尝试连接Mountain Lion Server消息服务器时(或许其他服务器具有相同的要求),这发生在我身上。

朋友找到了解决这个问题的简单方法:

#!/usr/bin/env ruby
require 'rubygems'
require 'xmpp4r'
require 'xmpp4r/roster'
require 'xmpp4r/client'
require 'xmpp4r/muc'

Jabber::debug = true
client = Jabber::Client.new(Jabber::JID.new('user@macbook.local'))
client.connect
client.auth('password')
muc = Jabber::MUC::MUCClient.new(client)
muc.join(Jabber::JID::new('chatroom@conference.macbook.local' + client.jid.node))

# add the callback to respond to server ping
client.add_iq_callback do |iq_received|
  if iq_received.type == :get
    if iq_received.queryns.to_s != 'http://jabber.org/protocol/disco#info'
      iq = Jabber::Iq.new(:result, client.jid.node)
      iq.id = iq_received.id
      iq.from = iq_received.to
      iq.to = iq_received.from
      client.send(iq)
    end
  end
end

我希望这段代码可以帮助其他人。

问候 爱德华