2017-06-01 2 views
2

Ich bin ziemlich neu zu Programmierung im Allgemeinen und ich benutze EventMachine auf der Client-und Server-Seite, um eine Websocket-Verbindung zwischen ihnen zu öffnen.EventMachine Reconnection Probleme

Mein Problem ist mit der Client-Seite, und wenn die Verbindung aufgrund von Problemen mit der Netzwerkverbindung verloren geht.

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 

Diese Verbindung zum Server her ganz gut, aber wenn ich die Netzwerkverbindung ziehen und wieder einstecken ich in einer Endlosschleife von ihm stecken bin versucht, mit dem Code 1002 wieder zu verbinden (WebSocket-Protokollfehler.).

Ich habe versucht, EM.reconnect (server, port, ws) auf schließen, aber es stürzt ab und wirft diesen Fehler `connect_server ': Adresse kann nicht aufgelöst werden: Der angeforderte Name ist gültig, aber keine Daten der angeforderten Typ wurde gefunden. Das macht Sinn, weil es DNS nicht kontaktieren kann. Selbst wenn man die EM.reconnect in eine begin rette einpackt versucht es einfach einmal und versucht es nie wieder.

Ich habe versucht, EventMachine zu beenden und zu schließen (EM.stop), aber das bleibt in einer Endlosschleife stecken, die versucht, die Verbindung wiederherzustellen.

Ich bin nicht wirklich sicher, wie dieser Client nach einem Netzwerkverlust die Verbindung zum Server wiederherstellen kann.

EDIT: Der Code oben ein wenig aktualisiert.

CMD Line:
Erfolg WS: #WebSocket :: eventmachine :: Kunde: 0x00000002909ac8
Pulled Ethernet-Kabel
Rettungs WS:
Connected Ethernet-Kabel
Erfolg WS: #WebSocket :: EventMachine :: Client: 0x000000031c42a8
Erfolg WS: #WebSocket :: EventMachine :: Client: 0x000000031a3d50
Erfolg WS: #WebSocket :: EventMachine :: Client: 0x00000003198a90
CTRL + C
block in websocket_connection': undefined method OnOpen‘für nil: NilClass (NoMethodError)

So sieht es aus wie er denkt, seine Verbindungs, ich sehe keine Verbindungen auf der Serverseite.

Antwort

0

Nun, ich konnte keinen Weg finden, eine korrekte Verbindung mit EventMachine wiederherzustellen. Es sieht so aus, als würden in der EventMachine seltsame Dinge passieren, wenn Sie Ihre Netzwerkverbindung abbrechen. Am Ende habe ich die Ruby-App unter einem neuen Prozess neu gestartet und dann das aktuelle Skript gelöscht, nicht die beste Möglichkeit, dies zu tun, aber nach einer Woche, in der ich versucht habe, die Verbindung durch EventMachine wiederherzustellen, habe ich gerade aufgegeben. Dieser Code funktioniert unten.

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 
Verwandte Themen