我正在嘗試連接到遠程主機,一遍又一遍地等待它出現。但是,在一次連接拒絕例外(因為服務器尚未運行)后,它會不斷拋出 Socket closed 例外。為什么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
(一旦我完成除錯,我將注釋掉例外的列印。)
uj5u.com熱心網友回復:
縱觀OpenJDK的源代碼時connect(...)呼叫失敗,SocketImpl代碼呼叫close()的Socket。
這是 Java 11 中的代碼(在java.net.AbstractPlainSocketImpl):
protected void connect(String host, int port)
throws UnknownHostException, IOException
{
boolean connected = false;
try {
InetAddress address = InetAddress.getByName(host);
this.port = port;
this.address = address;
connectToAddress(address, port, timeout);
connected = true;
} finally {
if (!connected) {
try {
close(); // <<---- HERE
} catch (IOException ioe) {
/* Do nothing. If connect threw an exception then
it will be passed up the call stack */
}
}
}
}
這close()對通話SocketImpl物件通向Socket標記為已關閉的存在。
簡而言之,JavaSocket物件不支持在連接嘗試失敗后重試。如果您想重試,您的代碼需要創建一個新Socket物件。
它是否是討論正確的Socket,以這樣的行為是毫無意義的。它只是……而且這種情況極不可能改變。唯一可能改變的是他們可能會在Socketjavadocs 中記錄這種行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/373205.html
