Wenn ich bei Java-Sockets die soTimeout festlege, wie wird sich das Verhalten im Falle von aktiven Peer vs. passiven Peer verhalten? Wenn ich z.B. einen readtimeout-Wert von 1 Minute habe und eine Dateiübertragung durchführe, die 5 Minuten dauert, wird es dann eine readtimeout-Ausnahme geben oder nicht? Für mich ist es wichtig, eine Timeout-Ausnahme zu erhalten, wenn die Verbindung hängt.
Antwort
Zu viele Anzeigen?Die Einstellung soTimeout
betrifft explizit Operationen, die vom Eingabestrom des Sockets lesen. Man kann es sich vorstellen, als würde der Aufrufer einen zeitgesteuerten Block für Leseoperationen definieren. Aus der Javadoc für setSoTimeout
:
SO_TIMEOUT mit dem angegebenen Timeout in Millisekunden aktivieren/deaktivieren. Wenn diese Option auf einen nicht-nullen Timeout gesetzt ist, wird ein Aufruf von read() auf dem InputStream, der mit diesem Socket verbunden ist, nur für diese Zeitdauer blockieren. Wenn der Timeout abläuft, wird eine java.net.SocketTimeoutException ausgelöst, obwohl der Socket immer noch gültig ist.
Im Fall eines passiven Peers wird kein Timeout allein aufgrund des nicht Aufrufs von read
ausgelöst. Wenn es jedoch irgendwann einen read-Aufruf macht, muss der Aufruf Daten zurückgeben, bevor der soTimeout
abläuft, ansonsten wird eine SocketTimeoutException ausgelöst.