我正在尝试用户在XMPP服务器(Ejabberd)中联系朋友。我正在使用Ruby on Rails 3.2。 我们的想法是在数组中添加所有在线用户,以便在视图页面上使用它。
我发现了异步代码(如下所示),但它使用了Thread,并且很难在控制器方法上工作。
jid = Jabber::JID.new('user@localhost')
cl = Jabber::Client.new(jid)
cl.connect
cl.auth('123456')
@online_users = [] #online users queue
roster = Jabber::Roster::Helper.new(cl)
mainthread = Thread.current
roster.add_presence_callback { |item,oldpres,pres|
if item.online?
@online_users.push item
else
@online_users.delete_if {|x| x.jid == item.jid }
end
puts @online_users.inspect
puts "#{item.jid} - online: #{item.online?}"
}
cl.send(Jabber::Presence.new.set_show(:dnd))
t = Thread.new { sleep XMPP_REQUEST_TIMEOUT; mainthread.wakeup;}
Thread.stop
cl.close
所以我需要一些同步代码,或者某种方式在控制器方法中执行这种代码。
感谢。
答案 0 :(得分:3)
为此找到了另一个帮助我的解决方案:
我在ejabberd服务器中安装了mod_rest。此模块允许您对 ejabberdctl 的终端命令执行HTTP请求。
因此它有“ejabberdctl connected_users”,即在线返回用户。
因此,在使用 gem rest-client 的模型应用中,您可以执行类似的操作:
def online_users
response = RestClient.post('http://localhost:5280/rest', "connected_users")
response
end
答案 1 :(得分:1)
如果您使用Strophe.js之类的库在浏览器中执行此操作,与启用了BOSH的XMPP服务器通信,您将会更加快乐。存在的快照永远不会像您期望的那样有趣,并且您将在您前进的路径上遇到非常糟糕的身份验证/授权问题。