我们在响应请求的时候有绑定(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/