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

为什么Windows Java无法绑定到已绑定的端口?,java,windows,sockets,bind,Java,Windows,Sockets,Bind,在响应请求时,我们需要绑定到同一个本地端口。 下面是一个Java代码示例。在Linux上,我们可以绑定到同一个端口两次, 但在Windows上,我们在第二次绑定时出错。错误为BindException:地址已在使用中。用C编写的类似程序允许我们绑定两次。 是什么阻止Windows上的Java执行此操作?是否有允许绑定的注册表设置 import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAdd

在响应请求时,我们需要绑定到同一个本地端口。 下面是一个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); 
    }
}

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

Use-Dsun.net.useExclusiveBind=false

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


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

套接字流连接是TCP,您只能使用TCP绑定到端口一次,然后必须关闭连接才能重新绑定到同一端口C程序如何类似?我觉得不同的部分在这里是相关的。你有什么需要?如果这是由网络管理员在防火墙上实现的所谓安全功能,请将其删除。安全优势为零,这使得应用程序不可行。我们的JAVA FTP服务器应用程序在响应FTP端口请求时需要绑定到同一本地端口(即控制端口-1)。用户防火墙配置为仅允许从端口20进行FTP输出。唯一地址由远程地址和端口以及本地地址和端口组成。如果远程地址不同,则本地端口可以相同。第一次绑定始终成功,因此端口可用。第二个绑定失败。