10

在 Java 中,您可以将数字零作为 Socket 或 DatagramSocket 构造函数的单个参数。然后 Java 将该 Socket 绑定到一个空闲端口。是否可以将端口查找限制在特定范围内?

4

4 回答 4

7

Hrm,阅读文档后,我认为您不能。您可以绑定到任何端口,如果不可接受则重新绑定,或者重复绑定到您范围内的端口,直到成功。第二种方法将是最“有效”的。

我对这个答案感到不安,因为它......不雅,但我真的找不到其他任何东西:/

于 2008-09-22T15:53:51.603 回答
2

将套接字绑定到任何空闲端口(通常)是操作系统套接字支持的一个特性;它不是特定于 java 的。例如,Solaris 支持通过ndd命令调整临时端口范围。但是只有 root 可以调整范围,它会影响整个系统,而不仅仅是你的程序。

如果常规的临时绑定行为不适合您的需要,您可能必须使用 Socket.bind() 编写自己的。

于 2008-09-22T16:02:41.737 回答
2

这是您需要的代码:

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?
}
于 2008-09-22T17:03:42.387 回答
0

您可能会看一下实现您正在使用的函数的 java 代码。大多数 Java 库都是用 Java 编写的,因此您可能只是在其中看到了您需要的内容。

假设@Kenster 是正确的并且它是一个系统操作,您可能必须简单地迭代尝试绑定到每个端口或对其进行测试的端口。虽然有点痛苦,但应该不会超过几行代码。

于 2008-09-22T16:55:29.583 回答