java - 在 Java 中查找空闲端口

标签 java port ip-address javadoc inet-socket

我需要在 Java 应用程序中找到空闲端口。为什么下面的代码不起作用?它总是返回 0。

public int findFreePort() {
    int portNumber = new InetSocketAddress(0).getPort();
    return portNumber;
}

new InetSocketAddress() 的 Java 文档说:

创建一个套接字地址,其中 IP 地址是通配符地址,端口号是指定值。

有效的端口值介于 0 和 65535 之间。端口号为零将使系统在绑定(bind)操作中选择临时端口。

最佳答案

实际上,您输出的是您在构造函数中指定的端口成员。所以 0 是预期的。
javadoc 声明该端口将让系统为绑定(bind)操作选择一个临时端口。 它没有告诉端口号将直接在 InetSocketAddress 实例中用临时端口赋值。 实际上,您并没有对这个 InetSocketAddress 实例执行绑定(bind)操作。
很明显,您没有打开/创建套接字 channel 来与此实例通信。 所以你无法注意到端口的结果。

例如,这将 ServerSocket 绑定(bind)到 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 port before any binding : 0

local port after first binding : 65110

local port after second binding : 65111

randomSocketAddress port after all bindings : 0

您可以看到 InetSocketAddress 对象始终将 0 作为端口值,而 ServerSocket 对象则受益于临时端口。

关于java - 在 Java 中查找空闲端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51099027/

相关文章:

algorithm - 找出 IP 属于哪个子网的最有效方法是什么

java - 迭代存储在字符串中的一系列位

java - 打包时如何使maven "add directory entries"?

java - 如何在 Spring Boot 微服务应用程序之间传递用户 ID

linux - 使用 SOCAT 记录在端口上收到的消息

Java网络-如何永久禁止IP地址?

java - JSON 字符串验证 [Spring Boot] - 约束零值

apache - 运行 apache 的 Docker 容器总是暴露端口 80

java - 在 JAVA 中如何连接并等待端口完成 TIME_WAIT

javascript - 将主机解析为 IP 地址并使用 Chrome 扩展程序将其显示在弹出窗口中