为什么Windows Java不能绑定到已绑定的端口?

响应请求时,我们需要绑定到同一个本地端口。 以下是Java代码的示例。 在Linux上,我们可以绑定两次相同的端口,但是在Windows上,我们会在第二次绑定时出错。 错误是BindException:地址已经在使用中。 用C编写的类似程序允许我们绑定两次。 什么是防止在Windows上的Java这样做? 有没有registry设置来允许绑定?

import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; public class SocketTest { public static void main(String[] args) throws Exception { Socket s1 = new Socket(); s1.setReuseAddress(true); SocketAddress saremote = new InetSocketAddress("google.com", 80); SocketAddress salocal = new InetSocketAddress("10.1.1.98", 9990); s1.bind(salocal); s1.connect(saremote); Socket s2 = new Socket(); s2.setReuseAddress(true); SocketAddress saremote2 = new InetSocketAddress("yahoo.com", 80); SocketAddress salocal2 = new InetSocketAddress("10.1.1.98", 9990); s2.bind(salocal2); s2.connect(saremote2); } } 

使用-Dsun.net.useExclusiveBind = false

Windows平台上的网络API实现已经发生了变化。 网络API的实现在Windows上已经改变,默认使用SO_EXCLUSIVEADDRUSE套接字选项。 此更改对于解决在使用需要绑定到同一端口的IPv4和IPv6应用程序时出现的异常情况。

此更改可能会导致依赖于具有绑定到相同地址和端口的多个进程的能力的应用程序出现问题。 发生此类问题时,请使用sun.net.useExclusiveBind系统属性作为临时解决方法来恢复传统行为。

这在Linux和Windows上都是可行的。 您可能有另一个应用程序(也许是以前版本的应用程序,它没有终止)运行和使用相同的端口。