为什么下面的代码不会抛出“java.net.BindException:已经在使用的地址:JVM_Bind” 异常?多次绑定到同一个端口?
import java.net.InetSocketAddress;
import java.net.ServerSocket;
public class Test
{
public static void main(String[] args) throws Exception
{
try (ServerSocket socket1 = new ServerSocket();
ServerSocket socket2 = new ServerSocket();
ServerSocket socket3 = new ServerSocket())
{
int port = 10000;
socket1.setReuseAddress(false);
socket1.bind(new InetSocketAddress("0.0.0.0", port));
socket2.setReuseAddress(false);
socket2.bind(new InetSocketAddress("127.0.0.1", port));
socket3.setReuseAddress(false);
socket3.bind(new InetSocketAddress("127.0.0.2", port));
Thread.sleep(Long.MAX_VALUE);
}
}
}
运行 'netstat的' 事后显示:
C:\Users\Administrator>netstat -a -n | findstr 10000 TCP 0.0.0.0:10000 0.0.0.0:0 LISTENING TCP 127.0.0.1:10000 0.0.0.0:0 LISTENING TCP 127.0.0.2:10000 0.0.0.0:0 LISTENING TCP [::]:10000 [::]:0 LISTENING
我是在Windows Server上运行这个2008 R2(64位),和 'IPCONFIG/ALL' 显示只有一个网络适配器/接口(其它网络适配器被禁用)。但是,在其他一些机器上,这个程序确实会抛出预期的“java.net.BindException:地址已经在使用:JVM_Bind”!
可能会发生什么?
他们是不一样的端口。它们是相同的端口号。不同的套接字可能会根据哪个(虚拟)接口发送相同的数据包而得到通知。 –
但我在该机器上只有一个网络接口 – ManRow
环回虚拟接口有很多IP地址。即使使用相同的端口号,您也可以分别监听它们中的每一个。 –