2016-11-05 2 views
1

lesen Wenn ich mSocket.setSoTimeout(1000); stelle ichErste Operation timed Ausnahme heraus Buchse

java.net.SocketTimeoutException erhalten: Lesen

nach Wartezeit von einer Sekunde auf mSocket.getInputStream().read() der erwartet wird, abgelaufen.

Aber, wenn ich mSocket.setSoTimeout(0); ich

java.net.SocketException erhalten: Operation

nach etwa einer Minute (55 Sekunden in den meisten meiner Läufe) Zeitüberschreitung Warte das ist rätselhaft.

Ich habe versucht, sysctl TCP-Einstellungen auf meinem Mac OS El Capitan ohne Erfolg zu erhöhen. Wenn diese Einstellungen das Zeitlimit auf ungefähr eine Minute beschränkten, hätte ich die gleiche Auszeit-Ausnahme wie zuvor erhalten. Was ist diese Zeitüberschreitung der Operation?

Edit: Es ist wahrscheinlich erwähnenswert, dass ich absichtlich das Netzwerk mit pfctl herunterbringe und da ich websockets über tcp verwende, erwarte ich, dass die Verbindung bei einem großen Timeout nicht unterbrochen wird und der Fluss fortgesetzt wird, sobald ich das Netzwerk hochbringe Noch einmal.

Der Stack-Trace für beide Ausnahmen ist die gleiche, dh

at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:150) 
at java.net.SocketInputStream.read(SocketInputStream.java:121) 
at java.net.SocketInputStream.read(SocketInputStream.java:203) 
at org.jwebsocket.kit.WebSocketProtocolAbstraction.protocolToRawPacket(WebSocketProtocolAbstraction.java:220) 
+0

Wurden gerade Sendevorgänge ausgeführt, wenn Sie das Netzwerk abschneiden? – EJP

+0

Ja, wahrscheinlich, da ich 1,5 msgs pro Sekunde sende. – user3740387

Antwort

0

Wenn eine Anwendung ruft setSoTimeout(0) dann für immer auf Daten warten tatsächlich OS kann. Es gibt jedoch verschiedene Arten von Ereignissen, die den Lesevorgang unabhängig vom SO_TIMEOUT-Wert unterbrechen.

Wenn das Betriebssystem die TCP-Verbindung hinter dem Socket zerstört, wird der Lesevorgang unterbrochen, weil die TCP-Verbindung nicht mehr existiert und es keine Möglichkeit gibt, in Zukunft Daten zu empfangen. Selbst wenn der Peer später Daten senden würde, würde der lokale TCP-Stack ihn fallen lassen (und vielleicht TCP-RST beantworten).

Das Betriebssystem hat die TCP-Verbindung zerstört, weil es Daten gesendet hat und keine ACK empfangen hat. Also OS versucht, Daten erneut zu übertragen und es gab nach und die Verbindung zerstört.

+0

Was das erste Argument betrifft, dass es verschiedene Arten von Ereignissen gibt, die den Lesevorgang unterbrechen könnten, wenn das Ereignis, das diesen Lesevorgang unterbricht, erst nach 54-56 Sekunden auftritt, nachdem das Netzwerk heruntergefahren wurde, vermute ich, dass die Zahl konfigurierbar wäre. Irgendeine Vermutung, was dieses Ereignis sein könnte? – user3740387

+0

Zum zweiten Punkt: "Das Betriebssystem hat die TCP-Verbindung zerstört, weil es Daten gesendet hat und keine ACK erhalten hat." Ich habe versucht, Systemvariablen mit sysctl zu manipulieren, ohne Erfolg. Da andere erfolgreich gewesen sind, eine noch größere Verbindung zu bekommen, die noch nicht funktioniert, was könnte ich falsch machen? Eine Minute ohne Antwort scheint zu kurz, um den TCP zu unterbrechen. – user3740387

Verwandte Themen