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

3

这个链接提供了一个打开非阻塞套接字的教程。然而,这里提供的方法没有选取任意随机端口的选项。此外,在java文档页面中显示的所有构造函数都需要传入地址作为参数。有什么解决方法吗?


我不知道NIO是否也可以这样做,但你可以尝试一下这个方法: https://dev59.com/2kvSa4cB1Zd3GeqPh95A。只需要绑定到端口0,就会自动选择一个随机空闲的端口。 - Warrior
2个回答

8
如果你查看InetSocketAddress的构造函数,它指出:

有效的端口值介于0和65535之间。端口号为0将允许系统在绑定操作中选择一个临时端口。

换言之,只需传入一个使用0作为端口参数的InetSocketAddress,这将导致随机端口被选择。
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
// Use wildcard ip (*) and ephemeral port
serverSocketChannel.socket().bind(new InetSocketAddress(0)); 

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接