ruby on rails - Ruby websocket client para websocket-rails
ruby-on-rails ruby-on-rails-4.1 (1)
Finalmente, he encontrado la solución. El problema es que el mensaje debe ser construido con un cierto formato para que sea entendido por websocket-rails.
Ejemplo: ws.send (''["new_message", {"data": "Ejemplo de mensaje"}]'')
donde new_message es el evento que websocket-rails está escuchando.
Estoy desarrollando una página web de rieles que necesita utilizar la funcionalidad de websocket para comunicarse con un cliente de Ruby externo. Para hacer esto, estoy usando la gema websocket-rails en el servidor de rieles, definiendo el evento client_connected client_disconnected y una acción específica para recibir los mensajes del cliente (new_message).
Del lado del cliente, he tratado de usar diferentes gemas de rubí, como faye-websocket-ruby y websocket-client-simple, pero siempre obtengo errores cuando intento enviar un mensaje. En el servidor no puedo encontrar la manera de procesar estos mensajes. Ambas gemas tienen un método de envío que solo acepta una cadena (no se puede especificar el nombre del evento)
El código que he estado usando es el siguiente:
Lado del servidor
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 / initializers / 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
Lado del cliente
websocket-client-simple
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'' )
}
Gracias por adelantado. Saludos.
PD: Avíseme si necesita más código.