Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java setSoTimeout在Windows上不工作_Java_Sockets_Jvm - Fatal编程技术网

Java setSoTimeout在Windows上不工作

Java setSoTimeout在Windows上不工作,java,sockets,jvm,Java,Sockets,Jvm,我试图在Java应用程序上设置套接字超时。一些开发人员在OSX上,其他人在Windows上。问题是在Windows机器上,我们遇到了一个SocketException:连接在恰好2分钟后重置,而不管超时设置为什么。然而,在OSX上,它的工作原理与预期完全一致 这似乎是JVM如何与底层Windows套接字库交互的一个具体问题。有没有办法解决这个问题 下面是创建套接字的代码片段 protected Socket openSocket() throws UnknownHostException, IO

我试图在Java应用程序上设置套接字超时。一些开发人员在OSX上,其他人在Windows上。问题是在Windows机器上,我们遇到了一个SocketException:连接在恰好2分钟后重置,而不管超时设置为什么。然而,在OSX上,它的工作原理与预期完全一致

这似乎是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。

读取超时不会导致连接重置。它们导致
socketTimeoutException
(在Java中)

因此,连接重置并不是设置读取tiemout不起作用的证据。它可能是其他东西的证据,例如防火墙规则


您的猜测是错误的。

问题在于调用方法中的以下代码

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_等待发送,Windows似乎在两分钟后自动杀死处于该状态的套接字。然后,当读取发生时,它导致SocketException:连接重置。

FIN\u WAIT未发送。FIN已发送。如果您有一些独立证据表明“Windows在两分钟后自动杀死处于该状态的套接字”,请提供它。如果这是真的
shutdown()。