2016-06-29 13 views
1

Ich baue einen Server basierend auf ruby-websockets-chat-demo, aber habe es erweitert, um One-to-One-Client/Server-Kommunikation über isolierte Kanäle zu unterstützen. Ich habe den Basisserver zu diesem Zeitpunkt gut funktioniert, aber ich muss weiter entwickeln und erweitern.Fehlersuche Websocket 1006

Mein Problem ist, dass, immer wenn ein Fehler innerhalb des Servers auftritt, ein Schließen mit einem 1006 auf den Client geworfen wird und es einfach ohne eine Ahnung beendet, was passiert ist. Das ist in der Produktion sinnvoll, nehme ich an, aber es verursacht Chaos bei der Entwicklung.

Ich habe versucht, meine eigenen Rettungen und Fallen, aber sie scheinen nur ignoriert werden. Mit RubyMine kann ich Breakpoints setzen und den Code durchgehen, um herauszufinden, wo er zerbrochen ist, und dann das Problem identifizieren, aber das ist ein echter Schmerz.

Ich weiß nicht, was ist das Fangen der Fehler, ob es faye-Websocket, eventmachine oder etwas anderes wirklich ist. Weil es still gefangen und gehandhabt wird, ist es sehr schwer zu entdecken.

Gibt es eine Möglichkeit, diese Falle zu deaktivieren? Oder, was ist der beste Weg, Probleme in einem faye-websocket basierten Client und Server zu debuggen? Suche ich, ich konnte diese Informationen nicht finden. Wahrscheinlich nur noch nicht die passenden Suchkriterien getroffen.

Antwort

1

Wir gingen zurück zu den grundlegenden Ruby und diesen Code auf der „auf close“ Ereignis des Servers eingefügt:

if @debug 
puts "MyserverBackend>> Close entered. Last error:#{$!.class}:#{$!.to_s};Module:#{$0};" 
[email protected] { |backtrace| puts backtrace } 
exit 
end 

Dies identifiziert, wo ist der Fehler und Debugging verbessert auftreten. Zum Beispiel, wenn ich den Fehler durch die Ausgabe von „xputs“ statt „Puts“ in dem „auf Nachricht“ Ereignis gezwungen, erhalte ich jetzt diese klaren Informationen:

MyserverBackend>> Close entered. Last error:NoMethodError:undefined method `xputs' for #<Myserver::MyserverBackend:0x4c9b2e8>;Module:.../ruby/bin/rackup;Line:2; 
.../projects/myserver/middlewares/myserver_backend.rb:45:in `block (2 levels) in call' 
.../projects/myserver/middlewares/myserver_backend.rb:43:in `each' 
.../projects/myserver/middlewares/myserver_backend.rb:43:in `block in call' 
... 

Vor diesem, würde mein Kunde kündigt nur mit einem 1006 und der Server würde mir überhaupt nichts von dem erzählen, was passiert ist. Hoffe, das hilft jemandem, diese fiesen, ubiquitären 1006 Fehler zu debuggen.

ADDED OPTION: Ich fand eine andere Option. Ich führe diese Methode als die allererste Anweisung jeder WS-Methode wie open/message/close/error aus. Es ist mit EventMachine verbunden und läuft innerhalb von faye-websocket. Ich fand es here.

+0

Ich bin neugierig und ich hoffe, es ist in Ordnung, dass ich frage: Warum nicht ein vorhandenes Websocket-Framework verwenden (d. H. Faye/ActionCable/Plezi)? und warum EM Websockets anstelle eines Rack-Servers verwenden, der Websockets wie Jod unterstützt? Ich bin der Autor von Iodine und Plezi und ich möchte mögliche Nutzer vor der Veröffentlichung der neuen Versionen besser verstehen (sie sind auf GitHub). – Myst

+0

@Myst Kein Problem! Eigentlich benutze ich den Faye-Websocket-Rubin Edelstein, der Eventmachine verwendet. Ich benutze auch Redis PubSub. Insgesamt ist die Anwendung hochspezialisiert, so dass Out-of-the-Box-Lösungen nicht wirklich dafür geeignet sind. Ich habe eine ActionCable-App erstellt, um es auszuprobieren, aber die Clients sind Python-basierte Mikrosysteme, die nicht unterstützt wurden. Ich sah Plezi und Jodine an, entschied mich aber nicht dorthin zu gehen. Nach dem ActionCable wurde mir klar, dass ich die Kontrolle auf der unteren Ebene näher an der nativen Ebene haben wollte. Sicher schätzen Sie Ihre Arbeit! –

+0

Danke, dass du dir die Zeit genommen hast. Ich denke, ich verstehe deine Argumentation. Ich hoffe, das neue Jod (das in C geschrieben ist) und Plezi (Features wurden entfernt und dann hinzugefügt) würden die Implementierung von skalierbaren und niedrigeren Ebenen erleichtern. – Myst