ruby-on-rails websocket ruby-on-rails-4.1

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.