Ruby-клиент websocket для гема websocket-rails
Я разрабатываю веб-страницу rails, которая должна использовать функциональность websocket для взаимодействия с внешним клиентом ruby. Для этого я использую гем websocket-rails на сервере rails, определяя событие client_connected client_disconnected и определенное действие для получения сообщений от клиента (new_message).
На стороне клиента я пытался использовать разные рубиновые гемы, такие как faye-websocket-ruby и websocket-client-simple, но я всегда получаю ошибки при попытке отправить сообщение. На сервере я не могу найти способ обработки этих сообщений. У обоих гемов есть метод send, который принимает только строку (не может указать имя события)
Код, который я использовал, следующий:
Серверная сторона
приложение / контроллеры / 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
конфиг / 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
конфиг / Инициализаторы / 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
Сторона клиента
WebSocket-клиент-простой
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
Феи-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' )
}
Заранее спасибо. С уважением.
PD: Дайте мне знать, если вам нужно больше кода.
1 ответ
Наконец-то я нашел решение. Проблема заключалась в том, что сообщение должно быть построено в определенном формате, чтобы его могли понять websocket-rails.
Пример: ws.send ('["new_message", {"data": "Пример сообщения"}]')
где new_message - это событие, которое слушает websocket-rails.