Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为Java套接字指定端口范围?_Java_Tcp_Sockets_Udp - Fatal编程技术网

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

如何为Java套接字指定端口范围?,java,tcp,sockets,udp,Java,Tcp,Sockets,Udp,在Java中,可以将数字0作为套接字或DatagramSocket构造函数的单个参数。Java将该套接字绑定到一个空闲端口。是否可以将端口查找限制在特定范围内?Hrm,在阅读文档后,我认为您不能。您可以绑定到任何端口,如果不可接受,则重新绑定,或者重复绑定到范围内的端口,直到成功。第二种方法将是最“有效”的 我对这个答案感到不安,因为它是。。。不美观,但我真的找不到其他任何东西:/将套接字绑定到任何空闲端口(通常)是操作系统套接字支持的一项功能;它不是java特有的。例如,Solaris支持通过

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

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


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

将套接字绑定到任何空闲端口(通常)是操作系统套接字支持的一项功能;它不是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?
}
公共静态套接字getListeningSocket(){

对于(int-port=MIN\u-port;port-Well,对于非特权用户,在*nix:pun上它已经被限制为>1024,幸运的是我们在windows上运行;)您还应该注意,对空闲端口进行线性搜索有时会涉及安全问题。如果您对客户端1使用端口a,对下一个客户端使用端口a+1,则客户端1可以猜测您将对其他客户端使用的端口。您应该捕获
BindException
,这是在端口为空闲端口时启动的端口已经在使用了。