2016-09-29 10 views
-1

Ich versuche, ein Socket-Timeout für eine Java-Anwendung festzulegen. Einige der Entwickler sind unter OS X, andere unter Windows. Das Problem ist auf Windows-Rechnern, wir bekommen eine SocketException: Verbindung zurückgesetzt nach genau 2 Minuten, unabhängig davon, für was das Timeout eingestellt ist. Unter OS X funktioniert es jedoch genau wie erwartet.Java setSoTimeout funktioniert nicht unter Windows

Es scheint, dass dies speziell ein Problem mit der Interaktion der JVM mit den zugrunde liegenden Windows-Socket-Bibliotheken ist. Gibt es trotzdem eine Lösung für dieses Problem?

Hier ist ein Codefragment, das den Socket erstellt.

Der Code, der openSocket aufruft, ruft dann den gelesenen Socket auf.

Antwort

-1

Read-Timeouts verursachen keine Verbindungs-Resets. Sie verursachen SocketTimeoutExceptions (in Java).

Ein Verbindungs-Reset ist daher kein Beweis dafür, dass das Lesen des Tietmouts nicht funktioniert. Es könnte sich um etwas anderes handeln, zum Beispiel eine Firewall-Regel.

Ihre Vermutung ist falsch.

+0

@ downvoter Einige Fehler in der oben genannten? – EJP

-1

Das Problem war der folgende Code in die aufrufende Methode

StringBuffer responseText = new StringBuffer(); 
try (Socket socket = openSocket(); 
     OutputStream os = socket.getOutputStream(); 
     PrintStream psOut = new PrintStream(os, true); 
     BufferedReader inReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));) { 
    logger.trace("Opened socket"); 
    try { 
    psOut.println(requestXML); 
    } finally { 
     socket.shutdownOutput(); 
    } 

Dies verursachte FIN_WAIT, gesendet werden und es erscheint Windows-Sockets tötet in diesem Status automatisch nach zwei Minuten. Wenn der Lesevorgang dann ausgeführt wurde, verursachte es eine SocketException: Connection reset.

+0

FIN_WAIT wird nicht gesendet. FIN wird gesendet. Wenn Sie unabhängige Beweise dafür haben, dass "Windows Sockets in diesem Status automatisch nach zwei Minuten beendet", geben Sie dies bitte an. Wenn dies der Fall wäre, wäre 'shutdown()' mit SHUT_WR mehr oder weniger nutzlos. – EJP

Verwandte Themen