java - 在 Java 中查找空闲端口
问题描述
我需要在 Java 应用程序中找到一个空闲端口。为什么下面的代码不起作用?它总是返回 0。
public int findFreePort() {
int portNumber = new InetSocketAddress(0).getPort();
return portNumber;
}
Java doc ofnew InetSocketAddress()
说:
创建一个套接字地址,其中 IP 地址是通配符地址,端口号是指定值。
有效端口值介于 0 和 65535 之间。端口号为零将使系统在绑定操作中选择一个临时端口。
解决方案
实际上,您输出的是您在构造函数中指定的端口成员。所以0
是意料之中的。
javadoc 声明该端口将让系统为绑定操作选择一个临时端口。它并没有说明端口号将直接在InetSocketAddress
实例中使用临时端口进行评估。实际上,您不会对这个InetSocketAddress
实例执行绑定操作。
很明显,您没有打开/创建套接字通道来与此实例进行通信。所以你不能注意到端口的结果。
例如,这将 a 绑定ServerSocket
到 a 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
对象受益于拾取的临时端口。
推荐阅读
- android - 如何在 android 中检查设备兼容性以进行虹膜扫描身份验证
- java - 在java中的post方法中限制json大小
- javascript - 根据所需属性一次验证所有输入字段
- objective-c - 如何在目标 c 数据模型类中使用 Codable 协议?
- python - 如何为 Elasticsearch 序列化 Django GeoPt
- .htaccess - 如何使用 .htaccess 文件将断开的链接重定向到另一个页面?
- python - Pandas To_sql 超出范围错误
- ios - 如何在 iOS 中实现谷歌驱动?
- excel - VBA TransferSpreadsheet 导入问题
- c++ - STDLIB 对容器元素类型有什么要求?