2017-11-16 1 views
0

Ich habe einen Netty-Client, der gut funktioniert, wenn die Server-Anwendung zuhört. Wenn die Serveranwendung jedoch nicht ausgeführt wird und daher nicht den Port überwacht, wird der Client weiterhin so ausgeführt, als erwarte er, dass der Server vorhanden ist.Wie kann ich meinen Netty-Client erkennen lassen, wenn mein Netty-Server einen Port überwacht (ist verfügbar)?

Ich möchte den Fall behandeln, wenn der Server nicht zuhört und in einem solchen Fall nicht einmal die Daten senden (und stattdessen etwas anderes tun, wie dem Benutzer sagen, einen Administrator zu kontaktieren oder so). Ist das überhaupt möglich?

Hinweis: Wenn der Client versucht, eine Verbindung zu einem nicht angegebenen Port oder IP herzustellen, gibt mein Client Ausnahmen, die ich behandeln kann. Mein Problem ist, dass keine Ausnahmen ausgelöst werden, wenn der Server nicht den Port abhört, den er normalerweise hören soll.

+0

Sie können [URLConnection.setConnectionTimeout] (https://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html#setConnectTimeout-int-) verwenden, um eine Verbindung herzustellen. –

+0

Aber dann müsste ich warten bis diese Zeit abgelaufen ist. Ich könnte auch einfach warten, bis der Client fertig ist und prüfen, ob ein Ergebnis empfangen wurde, und wenn nicht, den Fall behandeln. Aber ich würde lieber einen Weg finden, herauszufinden, was mit meinem Server los ist, anstatt auf eine Zeitüberschreitung zu warten oder den Client zu beenden. Außerdem: Was würde passieren, wenn meine Verbindung aus irgendeinem Grund langsam wäre? Würde die Zeitüberschreitung die Verbindung in diesem Fall nicht abbrechen? – giro

+0

Eine Art "Ping" ist das. Für localhost könnte man versuchen, den Port an sich selbst zu binden (überprüfen, dass der Port frei ist), aber das ist ein schrecklicher Hack. Es tut uns leid. –

Antwort

1

Yeap. Manchmal kann nicht festgestellt werden, dass der Server nicht mehr am Port ist.

Also für diesen Fall können Sie zu Ihrer Client-Pipeline ReadTimeoutHandler hinzufügen. Das wird ReadTimeoutException für den Fall, dass Ihr Client keine Nachricht vom Server innerhalb der bestimmten Zeit erhalten. Dies kann jedoch nicht genug sein. Wenn Ihre Verbindung zwischen Server und Client beispielsweise nicht sehr aktiv ist, kann diese Ausnahme ebenfalls ausgelöst werden. In diesem Fall müssen Sie möglicherweise Ping-Pong-Handler implementieren, die für Ihre ReadTimeoutHandler zeigen, dass die Verbindung aktiv ist und die Ausnahme in diesem Fall nicht ausgelöst wird.

+1

Das "PingPong Handler" -Konzept scheint für mein Problem zu funktionieren. Nach etwas googeln versuchte ich den Code von diesem Beispiel https://gist.github.com/Toper-the-Geek/6729681#file-pingpongserverhandler-java – giro

Verwandte Themen