繁体   English   中英

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

[英]Java NIO sockets, connect at any available port?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM