Java setSoTimeout在Windows上不工作
我试图在Java应用程序上设置套接字超时。一些开发人员在OSX上,其他人在Windows上。问题是在Windows机器上,我们遇到了一个SocketException:连接在恰好2分钟后重置,而不管超时设置为什么。然而,在OSX上,它的工作原理与预期完全一致 这似乎是JVM如何与底层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
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()。