我需要在Java应用程序中找到一个空闲端口。为什么下面的代码不起作用?它总是返回0。
public int findFreePort() {
int portNumber = new InetSocketAddress(0).getPort();
return portNumber;
}
new InetSocketAddress()
的Java文档说:
创建一个套接字地址,其中IP地址为通配符地址,端口号为指定值。
有效的端口值在0到65535之间。端口号为零将使系统可以在绑定操作中使用临时端口。
答案 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