Java NIO套接字,可以在任何可用的端口连接吗?

时间:2016-05-27 17:32:47

标签: java sockets nonblocking

This链接提供了打开非阻塞套接字的教程。但是,此处提供的方法不提供拾取任何随机端口的选项。此java doc page处显示的所有构造函数都将地址作为参数。有什么办法吗?

2 个答案:

答案 0 :(得分:7)

如果你看一下InetSocketAddress的构造函数,就说明了

  

有效端口值介于0到65535之间。端口号为零将使系统在绑定操作中获取临时端口。

本质上,只需传入一个InetSocketAddress,使用0作为端口参数,这将导致选择一个随机端口。

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
// Use wildcard ip (*) and ephemeral port
serverSocketChannel.socket().bind(new InetSocketAddress(0)); 

答案 1 :(得分:2)

它有点hacky解决方案,但对我有用。你可以创建一个普通的Socket,端口参数为0(所以你得到一个随机的可用套接字)连接它,然后获取它的地址。现在关闭此套接字并在创建SocketChannel时将此地址作为参数传递。 但是要谨慎,这可能是多线程程序中的问题,其中线程并行创建套接字。考虑两个并行线程t1和t2。假设t1创建了一个套接字抓住它的地址,关闭它然后上下文切换。现在t2获得了相同的端口,在t1能够使用此套接字连接到非阻塞通道之前。对于这种情况,最好保持循环,直到没有建立非阻塞(SocketChannel)连接。