Java 多次绑定到同一端口?

Java 多次绑定到同一端口?,java,windows,sockets,networking,windows-networking,Java,Windows,Sockets,Networking,Windows Networking,为什么下面的代码不抛出“java.net.BindException:Address ready in use:JVM\u Bind” 例外 import java.net.InetSocketAddress; import java.net.ServerSocket; public class Test { public static void main(String[] args) throws Exception { try (ServerSocket s

为什么下面的代码不抛出“java.net.BindException:Address ready in use:JVM\u 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 C:\Users\Administrator>netstat-a-n | findstr 10000 TCP 0.0.0.0:10000 0.0.0.0:0侦听 TCP 127.0.0.1:10000 0.0.0.0:0侦听 TCP 127.0.0.2:10000 0.0.0.0:0侦听 TCP[::]:10000[::]:0正在侦听

我在Windows Server 2008 R2(64位)上运行此操作,“ipconfig/all”仅显示一个网络适配器/接口(其他网络适配器已禁用)。但是,在其他一些机器上,这个程序实际上抛出了预期的“java.net.BindException:Address ready in use:JVM_Bind”


可能发生什么情况?

您可以在不同IP地址的相同端口号上绑定。操作系统可以通过目标IP地址以及TCP端口号来区分传入的数据包

操作系统为
127.0.0.1:1000
127.0.0.2:1000
保留单独的服务器套接字没有问题。它知道每个数据包所属的位置——即使它打开了一个新的连接

请注意,IP地址
0.0.0.0
只是一个IP地址(它不是可以发送IP数据包的有效IP地址,但我也不支持
0.0.0==any
)。如果要侦听所有地址,请改为向InetSocketAddress提供
null
。此时,您有更大的机会获得所需的异常(除非操作系统决定通配符侦听具有较低的优先级,并且不会真正与特定侦听重叠,以便它们可以绑定两者)

还要注意,设置
setReuseAddress
不会影响绑定。它只影响哪些连接被拒绝或接受的一些细节


作为旁注——等待三亿年有什么意义?

它们不是同一个港口。它们是相同的端口号。不同的套接字可能会收到通知,这取决于相同数据包发送到哪个(虚拟)接口。但我在这台机器上只有一个网络接口环回虚拟接口有很多IP地址。即使端口号相同,您也可以分别侦听它们。@JanDvorak您的注释应该是答案。指定0.0.0.0和null之间没有区别。这两个都意味着不需要任何东西。出于这个原因,我很惊讶以后会有更具体的工作。如果没有0.0.0.0,我希望其他人也能工作,但没有0.0.0.0已经绑定。@EJP我最初也这么认为,但在文档中找不到支持这个想法的证据。我确实发现端口0也表示同一位置的任何端口。