为什么Windows Java无法绑定到已绑定的端口?

时间:2017-05-30 18:54:59

标签: java windows sockets bind

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

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); 
    }
}

2 个答案:

答案 0 :(得分:2)

使用-Dsun.net.useExclusiveBind = false

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

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

答案 1 :(得分:0)

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