【发布时间】:2008-09-22 15:26:11
【问题描述】:
在 Java 中,您可以将数字零作为 Socket 或 DatagramSocket 构造函数的单个参数。然后 Java 将该 Socket 绑定到一个空闲端口。是否可以将端口查找限制在特定范围内?
【问题讨论】:
-
好吧,对于非特权用户,它在 *nix 上已经限制为 >1024:P
-
不幸的是我们在 windows 上运行 ;)
在 Java 中,您可以将数字零作为 Socket 或 DatagramSocket 构造函数的单个参数。然后 Java 将该 Socket 绑定到一个空闲端口。是否可以将端口查找限制在特定范围内?
【问题讨论】:
Hrm,在阅读文档后,我认为您不能。您可以绑定到任何端口,如果不可接受则重新绑定,或者重复绑定到您范围内的端口,直到成功。第二种方法将是最“有效”的。
我对这个答案感到不安,因为它......不雅,但我真的找不到其他任何东西:/
【讨论】:
将套接字绑定到任何空闲端口(通常)是操作系统套接字支持的一个特性;它不是特定于 java 的。例如,Solaris 支持通过 ndd 命令调整临时端口范围。但是只有 root 可以调整范围,它会影响整个系统,而不仅仅是你的程序。
如果常规的临时绑定行为不适合您的需要,您可能必须使用 Socket.bind() 编写自己的。
【讨论】:
这是您需要的代码:
public static Socket getListeningSocket() {
for ( int port = MIN_PORT ; port <= MAX_PORT ; port++ )
{
try {
ServerSocket s = new ServerSocket( port );
return s; // no exception means port was available
} catch (IOException e) {
// try the next port
}
}
return null; // port not found, perhaps throw exception?
}
【讨论】:
BindException,它是在端口已被使用时启动的。
您可能会看一下实现您正在使用的函数的 java 代码。大多数 Java 库都是用 Java 编写的,因此您可能只是在其中看到了您需要的内容。
假设@Kenster 是正确的并且这是一个系统操作,您可能必须简单地迭代端口以尝试绑定到每个端口或对其进行测试。虽然有点痛苦,但应该不会超过几行代码。
【讨论】: