如何为Java套接字指定端口范围?

时间:2020-03-06 14:32:43  来源:igfitidea点击:

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

解决方案

嗯,在阅读了文档之后,我认为我们没有能力。我们可以绑定到任何端口,然后在不可接受的情况下重新绑定,或者重复绑定到我们范围内的端口,直到成功。第二种方法将是"最有效的"。

我对此回答感到不安,因为它很不雅,但我真的也找不到其他任何东西://

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

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

我们可能会看一眼实现我们正在使用的功能的Java代码。大多数Java库都是用Java编写的,因此我们可能只是在其中看到了所需的内容。

假设@Kenster是正确的并且是系统操作,则可能必须简单地遍历端口以尝试绑定到每个端口或者对其进行测试。尽管有些痛苦,但不应超过几行代码。

这是我们需要的代码:

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?
}