我正在使用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"}
最糟糕的事情 - 我的服务器没有响应其他响应,尽管我使用的是Puma多线程服务器。
实现这样的功能的正确方法是什么?
答案 0 :(得分:0)
我得到了解决方案
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