2015-06-27 8 views
0

У меня есть приложение Rails с камнем websocket-rails.Триггер/Подпишитесь на websocket-rails событие изнутри рельса бегун

Внутри моего приложения есть демон, который я запускаю с rails runner MyDaemon.start

Я использую websocket-rails Synchronization, так что мой config/initializers/websocket_rails.rb выглядит следующим образом:

WebsocketRails.setup do |config| 
    config.log_internal_events = false 
    config.standalone = false 
    config.synchronize = true 
end 

Внутри MyDaemon, используя синхронизацию, я могу вызвать событие что достигнет как моих WebsocketRails::BaseController, так и моего javascript WebSocketRails.

Что я пытаюсь сделать, так это найти способ привязки к событиям из моего MyDaemon.

Я пытался реализовать простой клиент WebSocket, используя как faye-websocket-ruby и websocket-client-simple, но после того, как стучал головой на клавиатуре в течение некоторого времени, я понял, что есть какой-то процесс «рукопожатия» с использованием connection_id из client_connected сообщение. В принципе, ни одно из решений, представленных в this other so question, не работает.

Мне нужно понять, если внутри моего MyDaemon Я могу подписаться непосредственно на обратный вызов WebsocketRails, даже внутри EventMachine, или как я должен реализовать клиент Websocket в Ruby.

Моя последнюю попытку есть клиент рубинового можно найти в this gist, и это пример вывод:

ruby client.rb ws://localhost:3000/websocket 
[:open, {"upgrade"=>"websocket", "connection"=>"Upgrade", "sec-websocket-accept"=>"zNTdGvxFKJeP+1PyGf27T4x2PGo="}] 

JSON message is 
[["client_connected", {"id"=>nil, "channel"=>nil, "user_id"=>nil, "data"=>{"connection_id"=>"4b7b91001befb160d17b"}, "success"=>nil, "result"=>nil, "token"=>nil, "server_token"=>nil}]] 

client id is 4b7b91001befb160d17b 
[:message, "[[\"client_connected\",{\"id\":null,\"channel\":null,\"user_id\":null,\"data\":{\"connection_id\":\"4b7b91001befb160d17b\"},\"success\":null,\"result\":null,\"token\":null,\"server_token\":null}]]"] 

JSON message is 
[["websocket_rails.ping", {"id"=>nil, "channel"=>nil, "user_id"=>nil, "data"=>{}, "success"=>nil, "result"=>nil, "token"=>nil, "server_token"=>nil}]] 

Sending ["pong",{}] 
[:message, "[[\"websocket_rails.ping\",{\"id\":null,\"channel\":null,\"user_id\":null,\"data\":{},\"success\":null,\"result\":null,\"token\":null,\"server_token\":null}]]"] 
[:close, 1006, ""] 

Хотя журнал websocket-rails является:

I [2015-06-27 02:08:45.250] [ConnectionManager] Connection opened: #<Connection::2b3dddaf3ec4ed5e3550> 
I [2015-06-27 02:08:45.251] [Dispatcher] Started Event: client_connected 
I [2015-06-27 02:08:45.251] [Dispatcher] Name: client_connected 
I [2015-06-27 02:08:45.251] [Dispatcher] Data: {"connection_id"=>"2b3dddaf3ec4ed5e3550"} 
I [2015-06-27 02:08:45.251] [Dispatcher] Connection: #<Connection::2b3dddaf3ec4ed5e3550> 
I [2015-06-27 02:08:45.251] [Dispatcher] Event client_connected Finished in 0.000174623 seconds 
I [2015-06-27 02:09:05.252] [ConnectionManager] Connection closed: #<Connection::2b3dddaf3ec4ed5e3550> 
I [2015-06-27 02:09:05.252] [Dispatcher] Started Event: client_disconnected 
I [2015-06-27 02:09:05.252] [Dispatcher] Name: client_disconnected 
I [2015-06-27 02:09:05.252] [Dispatcher] Connection: #<Connection::2b3dddaf3ec4ed5e3550> 
I [2015-06-27 02:09:05.253] [Dispatcher] Event client_disconnected Finished in 0.000236669 seconds 

Возможно я пропуская что-то очень глупо, поэтому я здесь, чтобы попросить вашу помощь!

ответ

0

Вы можете использовать йод в качестве клиента WebSocket (я автор):

require 'iodine/http' 
# prevents the Iodine's server from running 
Iodine.protocol = :timer 
# starts Iodine while the script is still running 
Iodine.force_start! 
options = {} 
options[:on_open] = Proc.new {puts 'Connection Open'; write "Hello World!" } 
options[:on_close] = Proc.new {puts 'Connection Closed'} 
options[:on_message] = Proc.new {|data| puts "I got: #{data}" } 

# connect to an echo server for demo. Use the blocking method: 
websocket = Iodine::Http::WebsocketClient.connect "wss://echo.websocket.org/", options 
websocket << "sending data" 
sleep 0.5 
websocket.close 

Как и в сторону, обратите внимание, чтение вокруг, я заметил, что websocket-rails камень не обновляется все, что много. См. this question

В качестве альтернативы вы можете запускать веб-сайты внутри своего приложения Rails с помощью Plezi framework (я автор).

Это очень простое использование обеих фреймворков одновременно на одном сервере. Таким образом, вы можете использовать код модели Rails внутри вашего контроллера Plezi Websocket.

Поскольку Plezi будет управлять веб-сайтами, а Rails, вероятно, отобразит страницу 404 Not Found, маршруты Plezi будут иметь приоритет ... но пока ваши маршруты не переопределяют друг друга, вы являетесь золотым.

Обратите внимание, что для того, чтобы оба приложения могли работать вместе, Plezi заставит вас использовать Iodine server в качестве вашего сервера стойки. Чтобы этого избежать, вы можете использовать API-интерфейс Placebo и запустить Plezi в другом процессе.

Вы можете узнать больше о рамах README file.