2012-12-20 2 views
0

Я пытаюсь создать приложение websocket rails с помощью em-websocket. Я разместил ниже код в файле config/initalizers/websocket.rb, но когда я запускаю сервер rails, приложение не запускается. если я удалю код, он начнет нормально работать. То же самое происходит на моей локальной машине и сервере.сервер rails не запускается с em-websocket

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 

Любые идеи будут высоко оценены

ответ

2

Я раньше не использовал этот камень, но похоже, что вы запускаете сервер в инициализаторе.

Выполнение приостанавливается в основном потоке, пока ваш сервер Websockets не вернет ему контроль (который, предположительно, будет закрыт, когда сервер ваших веб-серверов закрыт).

Возможно, вы хотите, чтобы сервер был отдельным приложением, поэтому у вас есть сервер, который отвечает на HTTP (ваш сервер Rails), и сервер, который отвечает на сокеты (то, что ваш файл инициализации является началом).

+0

Это правда, но разве не возможно иметь 1 приложение для обоих серверов? Итак, вам нужно только запустить 1 приложение, использовать 1 консоль и развернуть только один раз? –

+0

Хм. Если вы действительно хотите это сделать, я бы использовал Thin как ваш веб-сервер разработки. Это чисто гипотеза, но Thin имеет бэкэнд EventMachine (который Webrick не делает), и поэтому теоретически EventMachine.run должен привязываться к глобальной замкнутой петле реактора? –

+1

Я только что наткнулся на драгоценный камень, названный [мастером] (https://www.google.nl/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CDQQFjAA&url=https%3A%2F%2Fgithub. com% 2Fddollar% 2Fforeman & ei = 15NqUa-3B4nO0QXByoAY & usg = AFQjCNHI9ByOifzjRiX1pZPe9vk_OM7QUg & sig2 = Yhweb3l7sx31qVyBQR7NpA & bvm = bv.45175338, d.d2k), вы можете привязать пару имен к процессам и запустить их все с помощью 'foreman start'. Что я сделал, это поставить сервер для сокетов в папке с именем «socket_server» и добавлены исправления выполнения для рельсов и сервер сокетов (faye) для мастера 'Procfile' .. –

0

Первое решение:

  • Move websocket.rb в /конфигурации (не внутри Инициализаторы)
  • После запуска 'рельсы сервера' открыть другую консоль.
  • Перейти к your_project_path/конфигурации/ и запустить 'рубин websocket.rb'

Второе решение:

Поместите свой код внутри Thread, чтобы избежать основной блокировки потока.

require 'eventmachine' 
require 'em-websocket' 

Thread.new { 

# Your websocket code 

} 
Смежные вопросы