我正在尝试使用em-websocket构建rails websocket应用程序。我已将下面的代码放在文件config / initalizers / websocket.rb中但是当我运行'rails server'时,应用程序无法启动。如果我删除代码,它开始正常。在我的本地机器和服务器上也会发生同样的事情。
require 'eventmachine'
require 'em-websocket'
EventMachine.run {
EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen {
puts "WebSocket connection open"
ws.send "Hello Client"
}
ws.onclose { puts "Connection closed" }
ws.onmessage { |msg|
puts "Recieved message: #{msg}"
ws.send "Pong: #{msg}"
}
end
puts "Websocket started"
}
我将此控制台打印出来
=> Booting WEBrick
=> Rails 3.2.1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Websocket started
如果我删除上面的代码就可以了,我得到了:
=> Booting WEBrick
=> Rails 3.2.1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-12-21 04:19:52] INFO WEBrick 1.3.1
[2012-12-21 04:19:52] INFO ruby 1.9.3 (2012-04-20) [i386-mingw32]
[2012-12-21 04:19:52] INFO WEBrick::HTTPServer#start: pid=1484 port=3000
任何想法都将受到高度赞赏
答案 0 :(得分:3)
之前我没有使用过这个gem,但看起来你在初始化程序中启动了一个服务器。
然后在主线程上暂停执行,直到您的Websockets服务器将控制权返回给它(这可能是您的websockets服务器关闭时)。
您可能希望服务器作为单独的应用程序,因此您有一个响应HTTP(您的Rails服务器)的服务器,以及响应套接字的服务器(初始化程序文件的开头)。
答案 1 :(得分:0)
第一个解决方案:
第二个解决方案:
将代码放在Thread中,以避免主线程阻塞。
require 'eventmachine'
require 'em-websocket'
Thread.new {
# Your websocket code
}