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