在Java中,您可以将数字0作为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?
}

您可能会看一下实现您正在使用的函数的java代码。大多数java库都是用Java编写的,所以你可能只看到你需要的东西。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top