无限听jabber事件?
我正在使用Jabber在Ruby on Rails上编写一个聊天应用程序。 发送消息非常容易实现,但是在循环中接收消息是一个相当大的挑战。
我希望在没有浏览器刷新的情况下从服务器获取回调。 我尝试使用ActionController :: Live。
在我的客户端,我的代码是:
var source = new EventSource('/chat/events'); source.addEventListener('refresh', function(event) { AddMessage(event.data); });
我的控制器代码是:
def chat_events # SSE expects the `text/event-stream` content type response.headers['Content-Type'] = 'text/event-stream' sse = Reloader::SSE.new(response.stream) puts "Starting XMMP call" begin @xmmpClient = XmppClient.new @xmmpClient.loginUsingNameAndPassword(****, ***) @xmmpClient.listen_connections sse rescue IOError puts "Error" # When the client disconnects, we'll get an IOError on write ensure puts "closing stream" sse.close end end
而且,我的XMMP客户端是:
def listen_connections(writer = nil) if not @logged_in puts "Not logged" raise "Not logged" end @robot.send(Jabber::Presence.new.set_show(nil)) loop do puts "Listening callback" @robot.add_message_callback do |message| puts "Got message " + message.inspect if not writer.nil? writer.write({ :message => message.body }, :event => 'refresh') end end sleep 2 end end
我得到了什么:
- 每隔一秒左右调用控制器的
chat_events
方法。 - 因此,一次执行几个回调。
-
当我收到消息时,我得到了四到五次。
{"message":"fffdsfd"} {"message":"fffdsfd"} {"message":"fffdsfd"} {"message":"fffdsfd"}
-
最糟糕的事情 – 我的服务器没有响应其他响应,虽然我使用的是Pumamultithreading服务器。
实现这样的function的正确方法是什么?
我得到了解决方案
puts "." client.add_message_callback do |message| if message.type != :error arr = message.from.to_s.split('@') puts arr[0] puts message.body end end while 1 end