簡體   English   中英

在 Java 中查找空閑端口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM