[英]Find free port in Java
我需要在 Java 應用程序中找到一個空閑端口。 為什么下面的代碼不起作用? 它總是返回 0。
public int findFreePort() {
int portNumber = new InetSocketAddress(0).getPort();
return portNumber;
}
new InetSocketAddress()
Java 文檔說:
創建一個套接字地址,其中 IP 地址是通配符地址,端口號是指定值。
有效端口值介於 0 和 65535 之間。端口號為零將使系統在綁定操作中選擇臨時端口。
實際上,您輸出在構造函數中指定的端口成員。 所以預期為0
。
javadoc 聲明該端口將讓系統為綁定操作選擇一個臨時端口。 它沒有說明端口號將直接在InetSocketAddress
實例中使用臨時端口進行InetSocketAddress
。 實際上,您不會使用此InetSocketAddress
實例執行綁定操作。
很明顯,你沒有打開/創建一個套接字通道來與這個實例進行通信。 所以你不會注意到端口的結果。
例如,這將ServerSocket
綁定到InetSocketAddress
:
ServerSocket ss = new ServerSocket(..);
ss.bind(new InetSocketAddress(0));
這是一個更完整的示例,說明事情是如何工作的:
public class InetSockerAddressWithEphemeralPortMain {
public static void main(String[] args) throws InterruptedException, IOException {
InetSocketAddress randomSocketAddressFirst = new InetSocketAddress(0);
try (ServerSocket ssOne = new ServerSocket()) {
System.out.println("randomSocketAddress port before any binding : " + randomSocketAddressFirst.getPort());
ssOne.bind(randomSocketAddressFirst);
System.out.println("local port after first binding :" + ssOne.getLocalPort());
}
try (ServerSocket ssTwo = new ServerSocket()) {
ssTwo.bind(randomSocketAddressFirst);
System.out.println("local port after second binding :" + ssTwo.getLocalPort());
System.out.println("randomSocketAddress port after all bindings : " + randomSocketAddressFirst.getPort());
}
}
}
輸出 :
任何綁定之前的 randomSocketAddress 端口:0
第一次綁定后的本地端口:65110
第二次綁定后的本地端口:65111
所有綁定后的 randomSocketAddress 端口:0
您可以看到InetSocketAddress
對象始終保持0
作為端口值,而ServerSocket
對象受益於拾取的臨時端口。
如果您只想在代碼中找到一個可用的端口,請執行以下操作:
private static int findFreePort() {
int port = 0;
// For ServerSocket port number 0 means that the port number is automatically allocated.
try (ServerSocket socket = new ServerSocket(0)) {
// Disable timeout and reuse address after closing the socket.
socket.setReuseAddress(true);
port = socket.getLocalPort();
} catch (IOException ignored) {}
if (port > 0) {
return port;
}
throw new RuntimeException("Could not find a free port");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.