2016-07-28 14 views
0

Ich mache eine Anwendung, wo der Client eine Nachricht an den Server sendet und wartet dann 5 Sekunden (lasst uns annehmen) für den Server zu antworten und wenn es keine Rückmeldung gibt, es erneut versucht. Wenn der Server mit der Nachricht antwortet, wird sie vom Client verarbeitet. Dies geht in der Schleife weiter und passiert nach einiger Zeit wieder.JAVA: Wann Socket setSoTimeout verwenden?

Zu diesem Zweck dachte ich, SetSoTimeout (Zeit) auf dem Client Socket zu verwenden, aber nach dem Lesen der Javadoc und viele Erklärungen im Internet bin ich verwirrt, ob dieser Ansatz richtig ist.

Was lese ich im Internet

(1) Wenn ich setSoTimeout auf dem Sockel verwenden dann das Timeout für die Dauer gibt, in dem die Verbindung hergestellt werden muss, und wenn festgestellt wird, nicht dann versucht, die Verbindung für die angegebene Zeit herzustellen.

(2) Wenn ich setSoTimeout am Socket verwende, wartet es auf eingehende Nachrichten für das angegebene Zeitintervall und wenn keine Nachricht empfangen wird, hört es auf zu warten.

Meine Fragen sind -

(1) Welche der oben wahr ist?

(2) Wenn die zweite Aussage wahr ist, kann ich sie dann für meine Implementierung verwenden?

(3) Wenn die zweite Aussage wahr ist, wann startet der Timeout-Timer genau? Ist es wenn ich den Socket deklariere und die Timeout-Zeit darauf festlege oder ist es wenn ich die Nachricht sende?

Wenn eine der Erklärungen nicht auf meinen Fall zutrifft, was sollte ich dann tun, um auf der Client-Seite für einen bestimmten Zeitraum zu warten, bis der Server antwortet? Wenn die Antwort kommt, sollte ich sie verarbeiten und den gleichen Prozess wiederholen. Wenn die Antwort nicht kommt, sollte ich weitermachen und den gesamten Prozess noch einmal wiederholen.

Antwort

-1

(1) Wenn ich setSoTimeout() auf dem Sockel verwende dann gibt es das Timeout für die Dauer, in der die Verbindung hergestellt werden muss, und wenn nicht erwiesen ist, dann wiederholt er die Verbindung zur gegebenen Zeit zu etablieren.

Dies ist falsch. setSoTimeout() verursacht überhaupt keine Wiederherstellung der Verbindung, geschweige denn 'für die gegebene Zeit'.

(2) Wenn ich setSoTimeout() auf dem Sockel verwenden dann wartet sie auf eingehende Nachrichten für das angegebene Zeitintervall und wenn keine Nachricht empfangen wird, dann hört sie auf zu warten.

Dies ist etwas genauer, aber es gibt keine Nachricht in TCP.

Die korrekte Erklärung ist, dass es bis zum angegebenen Timeout blockiert, damit mindestens ein Byte ankommt. Wenn innerhalb des Timeouts nichts eintrifft, wird SocketTimeoutException ausgelöst.

(1) Welche der oben genannten sind wahr?

Weder.

(2) Wenn die zweite Aussage wahr ist, kann ich sie dann für meine Implementierung verwenden?

Es ist nicht, so dass der zweite Teil nicht zutrifft, aber wenn eine Aussage wahr ist, können Sie sie als Teil Ihrer Implementierung verwenden. Du musst nicht fragen.

(3) Wenn die zweite Aussage wahr ist, wann startet der Timeout-Timer genau?

Wenn Sie read() anrufen.

Ist es, wenn ich den Socket deklariere und die Timeout-Zeit einstellen oder ist es, wenn ich die Nachricht sende?

Weder.

Wenn eine der Erklärungen nicht auf meinen Fall zutrifft, was sollte ich dann tun, um auf der Client-Seite für einen bestimmten Zeitraum zu warten, bis der Server antwortet?

Legen Sie einen Lese-Timeout fest.