为什么是java。网SocketException:socket在java之后关闭。网ConnectException:连接被拒绝'?
我正在尝试连接到一个远程主机,一遍又一遍地等待它出现。然而,在一次连接被拒绝的异常之后(因为服务器还没有运行),它会持续抛出socket关闭异常。为什么插座会被关闭?socket应该与调用失败的connect()之前处于相同的状态,不是吗
while(!tcpSock.isConnected()) {
try {
tcpSock.connect(destination);
} catch (SocketException e) {
System.err.println(e.toString());
}
}
导致
Setting TCP client mode connecting to remote host localhost/127.0.0.1 port 4500
java.net.ConnectException: Connection refused: connect
java.net.SocketException: Socket closed
java.net.SocketException: Socket closed
java.net.SocketException: Socket closed
java.net.SocketException: Socket closed
期望的行为是
Setting TCP client mode connecting to remote host localhost/127.0.0.1 port 4500
java.net.ConnectException: Connection refused: connect
java.net.ConnectException: Connection refused: connect
java.net.ConnectException: Connection refused: connect
java.net.ConnectException: Connection refused: connect
Established connection to: localhost port 4500
(调试完成后,我将注释掉异常的打印内容。)
# 1 楼答案
看看OpenJDK源代码。。。当
connect(...)
调用失败时,SocketImpl
代码调用Socket
上的close()
这是Java 11中的代码(在
java.net.AbstractPlainSocketImpl
):对
SocketImpl
对象的close()
调用会导致Socket
被标记为关闭简而言之,Java
Socket
对象不支持在连接尝试失败后重试。如果要重试,代码需要创建一个新的Socket
对象关于
Socket
这样做是否正确的讨论是无关紧要的。只是。。。而且这种情况极不可能改变。唯一可能改变的是,他们可能会在Socket
javadocs中记录这种行为