Java InetSocketAddress绑定的是哪个临时端口?

7

我希望实现的目标

为了进行单元测试,将服务器绑定到临时端口。

我的问题:

使用1.5.0_22 JDK,我尝试使用端口0绑定InetSocketAddress到临时端口,但是我无法从地址对象中找到它绑定的端口号,因此我无法相应地配置我的客户端:

InetSocketAddress address = new InetSocketAddress(0);
assertThat(address.isUnresolved(), is(false));
assertThat(address.getPort(), is(0));

我可能没有正确理解javadoc句子:
有效的端口值在0和65535之间。端口号为零将让系统在绑定操作中选择一个临时端口。
但是,即使在我的服务器侦听套接字后(我假设绑定已经发生),检查端口也只返回0(以下使用http://simpleweb.sourceforge.net/库):
    Container httpServer = new Container() {

        public void handle(Request req, Response resp) {
        }
    };
    SocketConnection connection = new SocketConnection(httpServer);
    InetSocketAddress address = new InetSocketAddress(0);
    connection.connect(address);

    assertThat(address.isUnresolved(), is(false));
    assertThat(address.getPort(), is(0));

使用nmap,我甚至看不到一个绑定的端口,所以我想我的理解是错误的。有人可以帮忙吗?


1
nmap可以从“外部”工作,但受到防火墙等因素的限制。如果要检查同一台机器上的端口绑定,请改用“netstat”,它会直接查询TCP堆栈,而不是进行探测和试探。 - Marc B
1个回答

11

InetSocketAddress 最初包含的端口为0,在 connect() 方法中并不会更新以反映绑定的实际端口。请调用 connection.getLocalPort() 或者 ((InetSocketAddress)connection.getLocalSocketAddress()).getPort() 来获取绑定的端口,而不是使用初始值。


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