我正在尝试使用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任何想法都将受到高度赞赏。
发布于 2012-12-21 03:18:13
我以前没有用过这个gem,但是它看起来像是在初始化中启动了一个服务器。
然后在主线程上暂停执行,直到Websockets服务器将控制权交还给它(可能是在websockets服务器关闭时)。
您可能希望服务器作为一个单独的应用程序,因此您有一个响应HTTP的服务器(您的Rails服务器),以及一个响应套接字的服务器(初始化器文件是它的开头)。
发布于 2017-07-18 08:08:31
第一个解决方案:
第二种解决方案:
将你的代码放在Thread中,以避免主线程阻塞。
require 'eventmachine'
require 'em-websocket'
Thread.new {
# Your websocket code
}https://stackoverflow.com/questions/13977208
复制相似问题