在Java中查找免费端口

时间:2018-06-29 09:53:38

标签: 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之间。端口号为零将使系统可以在绑定操作中使用临时端口。

2 个答案:

答案 0 :(得分:8)

实际上,您输出在构造函数中指定的端口成员。因此,预期0
Javadoc指出该端口将使系统选择一个临时端口进行绑定操作。 它没有告诉您端口号将直接在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());
        }

    }
}

输出:

  

任意绑定前的 SocketSocket端口:0

     

第一次绑定后的本地端口:65110

     

第二次绑定后的本地端口:65111

     所有绑定后的

randomSocketAddress端口:0

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

答案 1 :(得分:1)

如果您只想在代码中找到一个可用的端口,请执行以下操作:

CHROME_NOT_INSTALLED