EventMachine重新连接问题

时间:2017-06-01 17:58:54

标签: ruby eventmachine

我对编程很新,我在客户端和服务器端使用EventMachine来打开它们之间的websocket连接。

我的问题在于客户端,以及由于网络连接问题导致连接丢失时。

def websocket_connection
  EM.run do
    begin
      puts "Connecting"
      ws = WebSocket::EventMachine::Client.connect(:uri => "Server Info")
      puts "Success WS: #{ws}"
    rescue
      puts "I've been rescued"
      puts "Rescue WS: #{ws}"
      ws = nil
      sleep 10
      websocket_connection
    end

    ws.onopen do
      puts "Connected!"
    end

    ws.onping do
      put "Ping!"
    end

    ws.onmessage do |msg|
      puts msg
    end

    ws.onclose do |code|
      puts "Connection Closed!"
      puts "Code: #{code}"
      ws = nil
      sleep 10
      websocket_connection
    end
  end
end

这很好地连接到服务器,但如果我拉网络连接并将其重新插入,我会陷入无限循环,试图重新连接代码1002(WebSocket协议错误。)。

我试图在关闭时调用EM.reconnect(服务器,端口,ws),但它崩溃并抛出此错误`connect_server':无法解析地址:请求的名称有效,但没有所请求类型的数据被找到。这是有道理的,因为它无法联系DNS。即使在开始救援中包裹EM.reconnect,它也只会尝试一次而不会再次尝试。

我已经尝试停止EventMachine并关闭(EM.stop),但是它会陷入无限循环,试图重新连接。

我不确定如何让这个客户端在网络丢失后重新连接到服务器。

编辑: 稍微更新了上面的代码。

CMD专线:
    成功WS:#WebSocket :: EventMachine :: Client:0x00000002909ac8
    拉出以太网电缆
    救援WS:
    连接以太网电缆
    成功WS:#WebSocket :: EventMachine :: Client:0x000000031c42a8
    成功WS:#WebSocket :: EventMachine :: Client:0x000000031a3d50
    成功WS:#WebSocket :: EventMachine :: Client:0x00000003198a90
     CTRL + C
    block in websocket_connection': undefined method onopen'代表nil:NilClass(NoMethodError)

所以看起来它认为它的连接,我没有在服务器端看到任何连接。

1 个答案:

答案 0 :(得分:0)

好吧,我找不到使用EventMachine进行正确重新连接的方法。丢弃网络连接时,看起来在EventMachine中会发生奇怪的事情。我最终在一个新进程下重新启动ruby应用程序,然后杀死当前脚本,而不是最好的方法,但是在尝试通过EventMachine重新连接工作一周后,我刚刚放弃了。此代码适用于以下。

def websocket_restart
  exec "ruby script"
  exit 0
end

def websocket_connection
  EM.run do
    begin
      puts "Connecting"
      ws = WebSocket::EventMachine::Client.connect(:uri => "Server Info")
    rescue
      websocket_restart
    end

    ws.onopen do
      puts "Connected!"
    end

    ws.onping do
      put "Ping!"
    end

    ws.onmessage do |msg|
      puts msg
    end

    ws.onclose do |code|
      puts "Connection Closed!"
      puts "Code: #{code}"
      websocket_restart
    end
  end
end