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.