4

我想发送一个

“远离客户”

我的 websocket 连接每 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 秒内关闭。我应该如何发送“心跳”数据包?似乎连接是由他们的服务器关闭的,而不是我的。

4

2 回答 2

2

您可以使用Websocket Eventmachine Client gem 发送心跳:

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),然后使用它发送您的心跳。

于 2015-08-04T22:34:31.490 回答
2

如果您使用的是Iodine 的Websocket 客户端,则可以使用自动 ping 功能(其默认值且无法关闭) :

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

这是一个相当基本的客户端,但也易于管理。

编辑

Iodine 还包括一些 cookie 和自定义标头的支持,如现在在Iodine 的文档中所见。因此可以使用不同的身份验证技术(身份验证标头或 cookie)。

于 2015-08-05T02:28:40.403 回答