java - 为什么 Windows Java 无法绑定(bind)到已经绑定(bind)的端口?

标签 java windows sockets bind

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

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 套接字选项。此更改对于解决在使用需要绑定(bind)到同一端口的 IPv4 和 IPv6 应用程序时出现的异常是必要的。

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

关于java - 为什么 Windows Java 无法绑定(bind)到已经绑定(bind)的端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44269863/

相关文章:

java - 在 Java 8 中将日期转换为 EST

java - 处理大量 onClick id 的最佳方法?

c++ - 从凭据提供程序向 C# 服务提供凭据信息

mysql - 检索与最新消息、node js、socket io、mysql 聊天应用程序的对话

JavaFX 和 Spring Boot - NPE

java - 如何使用java代码刷新网页?

sql-server - 如何让window后台服务访问SQL Server数据库?

windows - 黑莓调试输出

c - 在Linux内核中设置socket输出端口号

互联网上的 Android P2P(直接连接)(在 NAT 之后)