【问题标题】:Java NIO sockets, connect at any available port?Java NIO 套接字,在任何可用端口连接?
【发布时间】:2016-05-27 17:32:46
【问题描述】:
This 链接提供了打开非阻塞套接字的教程。但是,此处提供的方法没有提供选择任何随机端口的选项。此外,java doc page 中显示的所有构造函数都将地址作为参数。有什么办法吗?
【问题讨论】:
标签:
java
sockets
nonblocking
【解决方案1】:
如果你查看InetSocketAddress 的构造函数,就会发现
有效的端口值介于 0 和 65535 之间。端口号为零将使系统在绑定操作中选择一个临时端口。
本质上,只需传入一个InetSocketAddress,使用 0 作为端口参数,这将导致选择一个随机端口。
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
// Use wildcard ip (*) and ephemeral port
serverSocketChannel.socket().bind(new InetSocketAddress(0));
【解决方案2】:
它有点老套的解决方案,但对我有用。您可以创建一个普通的 Socket,端口参数为 0(这样您就可以得到一个随机可用的套接字)连接它,然后获取它的地址。现在关闭此套接字并在创建 SocketChannel 时将此地址作为参数传递。
但是要小心,这在线程并行创建套接字的多线程程序中可能是一个麻烦。考虑两个并行线程 t1 和 t2。假设 t1 创建了一个套接字,获取了它的地址,将其关闭,然后进行了上下文切换。现在 t2 获得了相同的端口,在 t1 能够使用此套接字连接到非阻塞通道之前。对于这种情况,最好保持循环直到未建立非阻塞(SocketChannel)连接。