我对编程很新,我在客户端和服务器端使用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)
所以看起来它认为它的连接,我没有在服务器端看到任何连接。
答案 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