【问题标题】:which ephemeral port has java InetSocketAddress binded to?java InetSocketAddress 绑定到哪个临时端口?
【发布时间】:2011-12-01 16:02:29
【问题描述】:

我想要实现的目标

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

我的问题:

使用 1.5.0_22 JDK,我尝试根据 javadoc 使用端口 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 我什至看不到绑定端口,所以我假设我的理解不正确。有什么帮助吗?

【问题讨论】:

  • nmap 从“外部”工作,并受防火墙和诸如此类的影响。要检查同一台机器上的端口绑定,请改用“netstat”,它将直接查询 TCP 堆栈,而不是戳戳和刺激。

标签: java sockets jdk1.5


【解决方案1】:

connect() 不会更新最初包含端口 0 的 InetSocketAddress 以表示绑定到的实际端口。改为调用connection.getLocalPort()((InetSocketAddress)connection.getLocalSocketAddress()).getPort() 获取绑定端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多