【问题标题】: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)连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2012-02-25
      相关资源
      最近更新 更多