1) Was ist der Unterschied zwischen Verbindung und Lesezeitlimit für Sockets?
Das Verbindungszeitlimit ist das Zeitlimit beim Herstellen der ersten Verbindung. dh Abschluss des TCP-Verbindungs-Handshakes. Das Lesezeitlimit ist das Zeitlimit beim Warten auf das Lesen von Daten 1 . Insbesondere wenn der Server Sekunden nach dem letzten Byte kein Byte <Zeitlimit> sendet, wird ein Lesezeitlimitfehler ausgelöst.
2) Was bedeutet das auf "unendlich" eingestellte Verbindungszeitlimit? In welcher Situation kann es in einer Endlosschleife bleiben? und was kann auslösen, dass die Endlosschleife stirbt?
Dies bedeutet, dass der Verbindungsversuch möglicherweise für immer blockiert werden kann. Es gibt keine Endlosschleife, aber der Verbindungsversuch kann durch einen anderen Thread, der den Socket schließt, entsperrt werden. (Ein Thread.interrupt()
Anruf kann auch den Trick machen ... nicht sicher.)
3) Was bedeutet das auf "unendlich" eingestellte Lesezeitlimit? In welcher Situation kann es in einer Endlosschleife bleiben? Was kann dazu führen, dass die Endlosschleife endet?
Dies bedeutet, dass ein Aufruf read
des Socket-Streams für immer blockiert werden kann. Es gibt wieder keine Endlosschleife, aber die read
kann durch einen Thread.interrupt()
Anruf entsperrt werden, indem der Socket geschlossen wird und (natürlich) das andere Ende Daten sendet oder die Verbindung schließt.
1 - Es ist nicht ... wie ein Kommentator dachte ... die Zeitüberschreitung, wie lange ein Socket geöffnet oder inaktiv sein kann.
HttpURLConnection.getResponseCode()
für ungefähr hängend war. eine Woche, bis wir den Prozess neu gestartet haben. Es wurde offensichtlich kein Timeout auf der JVM-Seite und auch kein Timeout auf der Linux-Betriebssystemseite festgelegt.Socket.shutdownInput()
ohne Ihre Hand gehalten zu haben? Hinweis: Diese Zeitüberschreitungen werden von TCP und nicht von der JVM erzwungen.