Как отправить пакет поддержки активности через websocket в ruby ​​on rails

Я хочу отправить

"Оставайтесь в живых от клиента"

сообщение каждые 30 секунд для моего подключения к веб-сокету. Вот как выглядит код моего инициализатора websocket:

ws = WebSocket::Client::Simple.connect 'wss://bitcoin.toshi.io/'

ws.on :message do |msg|
  rawJson = msg.data
  message_response = JSON.parse(rawJson)
end

ws.on :open do
  ws.send "{\"subscribe\":\"blocks\"}"
end

ws.on :close do |e|
  puts "WEBSOCKET HAS CLOSED #{e}"
  exit 1
end

ws.on :error do |e|
  puts "WEBSOCKET ERROR #{e}"
end

Без какого-либо "поддержания активности" соединение закрывается примерно через 45 секунд. Как я должен отправить пакет "сердцебиение"? Кажется, что соединение закрыто их сервером, а не моим.

2 ответа

Решение

Вы можете использовать гем Websocket Eventmachine Client, чтобы послать beatbeat:

require 'websocket-eventmachine-client'

EM.run do
  ws = WebSocket::EventMachine::Client.connect(:uri => 'wss://bitcoin.toshi.io/')
  puts ws.comm_inactivity_timeout
  ws.onopen do
    puts "Connected"
  end

  ws.onmessage do |msg, type|
    puts "Received message: #{msg}"
  end

  ws.onclose do |code, reason|
    puts "Disconnected with status code: #{code}"
  end

  EventMachine.add_periodic_timer(15) do
    ws.send "{}"
  end
end

Вы можете установить таймер для EventMachine с EM::add_periodic_timer(interval_in_seconds), а затем отправьте свое сердцебиение с ним.

Вы можете использовать функцию автоматического пинга (по умолчанию, которую нельзя отключить), если вы используете клиент Isoine Websocket:

require 'iodine/http'
# prevents the Iodine's server from running
Iodine.protocol = :timer
# starts Iodine while the script is still running
Iodine.force_start!
# set pinging to a 40 seconds interval.
Iodine::Http::Websockets.default_timeout = 40

settings = {}
# set's the #on_open event callback.
settings[:on_open] = Proc.new do
    write 'sending this connection string.'
end
# set's the #on_message(data) event callback.
settings[:on_message] = Proc.new { |data| puts "Received message: #{data}" }
# connects to the websocket
Iodine::Http.ws_connect 'ws://localhost:8080', settings

Это довольно простой клиент, но им легко управлять.

РЕДАКТИРОВАТЬ

Йод также включает в себя поддержку некоторых файлов cookie и пользовательских заголовков, как теперь видно из документации Йода. Таким образом, можно использовать разные методы аутентификации (заголовки аутентификации или куки).

Другие вопросы по тегам