2015-02-03 18 views
5

Sto sviluppando una pagina Web di rails che deve utilizzare la funzionalità websocket per comunicare con un client ruby ​​esterno. Per fare questo, sto usando la gemma websocket rails nel server di rotaie, definendo l'evento client_connected client_disconnected e un'azione specifica per ricevere i messaggi dal client (new_message).Ruby client websocket per websocket-rails gem

Sul lato client ho cercato di utilizzare diversi gemme del rubino come Faye-websocket-ruby e websocket-client-semplice ma ho sempre ottengo gli errori quando si tenta di inviare un messaggio. Sul server non riesco a trovare il modo di elaborare questi messaggi. Entrambe le gemme ha un metodo di invio solo accetta una stringa (non essere in grado di specificare il nome della manifestazione)

Il codice che ho utilizzato è il seguente:

lato Server

app/controllers/chat_controller.rb

class ChatController < WebsocketRails::BaseController 
    def new_message 
    puts ')'*40 
    end 

    def client_connected 
    puts '-'*40 
    end 

    def client_disconnected 
    puts '&'*40 
    end 
end 

config/events.rb

WebsocketRails::EventMap.describe do 
    subscribe :client_connected, :to => ChatController, :with_method => :client_connected 

    subscribe :message, :to => ChatController, :with_method => :new_message 

    subscribe :client_disconnected, :to => ChatController, :with_method => :client_disconnected 
end 

config/inizializzatori/websocket_rails.rb

WebsocketRails.setup do |config| 
    config.log_path = "#{Rails.root}/log/websocket_rails.log" 
    config.log_internal_events = true 
    config.synchronize = false 
end 

lato client

websocket-client-semplice

require 'rubygems' 
require 'websocket-client-simple' 

ws = WebSocket::Client::Simple.connect 'ws://localhost:3000/websocket' 

ws.on :message do |msg| 
    puts msg.data 
end 

ws.on :new_message do 
    hash = { channel: 'example' } 
    ws.send hash 
end 

ws.on :close do |e| 
    p e 
    exit 1 
end 

ws.on :error do |e| 
    p e 
end 

hash = { channel: 'Example', message: 'Example' } 
ws.send 'new_message', hash 

loop do 
    ws.send STDIN.gets.strip 
end 

Faye-websocket

require 'faye/websocket' 
require 'eventmachine' 

EM.run { 
    ws = Faye::WebSocket::Client.new('ws://localhost:3000/websocket') 

    ws.on :open do |event| 
    p [:open] 
    end 

    ws.on :message do |event| 
    p [:message, event.data] 
    end 

    ws.on :close do |event| 
    p [:close, event.code, event.reason] 
    ws = nil 
    end 

    ws.send('Example Text') 
} 

Grazie in anticipo. Saluti.

PD: fammi sapere se hai bisogno di più codice.

risposta

3

Finalmente ho trovato la soluzione. Il problema era che il messaggio doveva essere costruito con un certain format per essere compreso da websocket-rails.

Esempio: ws.send ('[ "new_message", { "dati": "il messaggio di esempio"}]')

dove new_message è l'evento che websocket-rotaie sta ascoltando.

Problemi correlati