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

Java NIO sockets, connect at any available port?

This link provides a tutorial for opening a non-blocking socket. However the method provided here doesn't gives option of picking up any random port. Also all the constructors shown at this java doc page 将地址作为参数。有什么办法吗?

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

如果您查看 InetSocketAddress 的构造函数,则表明

A valid port value is between 0 and 65535. A port number of zero will let the system pick up an ephemeral port in a bind operation.

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

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