0

我正在尝试使用 em-websocket 构建一个 rails websocket 应用程序。我已将以下代码放在文件 config/initializers/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

任何想法将不胜感激

4

2 回答 2

3

我以前没有使用过这个 gem,但看起来你正在初始化程序中启动一个服务器。

然后在主线程上暂停执行,直到您的 Websockets 服务器将控制权返回给它(这可能是您的 websockets 服务器关闭时)。

您可能希望服务器作为一个单独的应用程序,因此您有一个响应 HTTP 的服务器(您的 Rails 服务器)和一个响应套接字的服务器(您的初始化程序文件的开头)。

于 2012-12-20T19:18:12.507 回答
0

第一个解决方案:

  • 将 websocket.rb 移动到/config(不在初始化程序中)
  • 运行“rails server”后,打开另一个控制台。
  • 转到your_project_path/config/并运行“ruby websocket.rb”

第二种解决方案:

将您的代码放入 Thread 中以避免主线程阻塞。

require 'eventmachine'
require 'em-websocket'

Thread.new { 

# Your websocket code

}
于 2017-07-18T00:08:30.763 回答