实际上,您输出的是您在构造函数中指定的端口成员。所以0
是意料之中的。
javadoc 声明该端口将让系统为绑定操作选择一个临时端口。它并没有说明端口号将直接在InetSocketAddress
实例中使用临时端口进行评估。实际上,您不会对这个InetSocketAddress
实例执行绑定操作。
很明显,您没有打开/创建套接字通道来与此实例进行通信。所以你不能注意到端口的结果。
例如,这将 a 绑定ServerSocket
到 a InetSocketAddress
:
ServerSocket ss = new ServerSocket(..);
ss.bind(new InetSocketAddress(0));
这是一个更完整的示例,说明了事情是如何工作的:
public class InetSockerAddressWithEphemeralPortMain {
public static void main(String[] args) throws InterruptedException, IOException {
InetSocketAddress randomSocketAddressFirst = new InetSocketAddress(0);
try (ServerSocket ssOne = new ServerSocket()) {
System.out.println("randomSocketAddress port before any binding : " + randomSocketAddressFirst.getPort());
ssOne.bind(randomSocketAddressFirst);
System.out.println("local port after first binding :" + ssOne.getLocalPort());
}
try (ServerSocket ssTwo = new ServerSocket()) {
ssTwo.bind(randomSocketAddressFirst);
System.out.println("local port after second binding :" + ssTwo.getLocalPort());
System.out.println("randomSocketAddress port after all bindings : " + randomSocketAddressFirst.getPort());
}
}
}
输出 :
任何绑定前的 randomSocketAddress 端口:0
第一次绑定后的本地端口:65110
第二次绑定后的本地端口:65111
所有绑定后的 randomSocketAddress 端口:0
您可以看到InetSocketAddress
对象始终保留0
为端口值,而 ServerSocket
对象受益于拾取的临时端口。