2016-09-29 8 views
-1

Javaアプリケーションでソケットタイムアウトを設定しようとしています。開発者の中にはOS Xを搭載しているものもあれば、Windows上にいるものもあります。この問題は、SocketExceptionが発生したWindowsマシンで発生します。タイムアウトが設定されているかどうかに関係なく、2分後に接続がリセットされます。しかし、OS X上では、期待どおりに動作します。Java setSoTimeoutがWindowsで動作しない

これは具体的には、JVMが基礎となるWindowsソケットライブラリとどのようにやりとりをしているかの問題です。この問題に対処する方法はありますか?

ここに、ソケットを作成するためのスニペットがあります。

protected Socket openSocket() throws UnknownHostException, IOException { 

    Socket socket = new Socket(); 
    SocketAddress endpoint = new InetSocketAddress(this.getHost(), this.getPort()); 
    try { 
     if (this.getConnectTimeout() != null) { 
     socket.connect(endpoint, this.getConnectTimeout()); 
     } else { 
     socket.connect(endpoint); 
     } 
    } catch (ConnectException ex) { 
     throw ex; 
    } catch (IOException ex) { 
     ConnectException connEx = new ConnectException( 
      String.format("Failed to connect to service at %s:%d. Reason: %s", 
       this.getHost(), this.getPort(), ex.getMessage())); 
     connEx.initCause(ex); 
     throw connEx; 
    } 

    logger.debug("Socket opened to {}:{}", this.getHost(), this.getPort()); 

    if (this.getResponseTimeout() != null) { 
     socket.setSoTimeout(this.getResponseTimeout()); 
    } 

    return socket; 
    } 

openSocketを呼び出すコードは、返されたソケットのreadを呼び出しています。

答えて

-1

読み取りタイムアウトによって接続がリセットされることはありません。それらはSocketTimeoutExceptions(Java)を引き起こします。

したがって、接続リセットは読み取りtiemoutの設定が機能していないという証拠ではありません。ファイアウォールルールなど、何か他のものの証拠かもしれません。

あなたの推測は偽です。

+0

@downvoter上記のいくつかのエラー? – EJP

-1

問題は、呼び出し元のメソッド

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(); 
    } 

に次のコードだったこれはFIN_WAITを送信させ、そして、Windowsが2分後に自動的にその状態でソケットを殺す表示されます。次に、読み取りが発生したときにSocketException:Connectionがリセットされました。

+0

FIN_WAITは送信されません。 FINが送信されます。 「Windowsが2分後に自動的にその状態のソケットを殺す」という独立した証拠がある場合は、それを入力してください。これが本当であれば、SHUT_WRを使った 'shutdown()'は多かれ少なかれ役に立たないでしょう。 – EJP

関連する問題