Как отправить пакет поддержки активности через 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 и пользовательских заголовков, как теперь видно из документации Йода. Таким образом, можно использовать разные методы аутентификации (заголовки аутентификации или куки).