我们需要在响应请求时绑定到同一本地端口。 下面是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);
}
}
答案 0 :(得分:2)
使用-Dsun.net.useExclusiveBind = false
Windows平台上的网络API实施发生了变化。 Windows上已更改网络API的实现,默认情况下使用SO_EXCLUSIVEADDRUSE套接字选项。此更改对于解决在使用需要绑定到同一端口的IPv4和IPv6应用程序时出现的异常情况是必要的。
此更改可能会导致应用程序出现问题,这些应用程序依赖于将多个进程绑定到同一地址和端口的能力。发生此类问题时,请使用sun.net.useExclusiveBind系统属性作为恢复旧行为的临时解决方法。
答案 1 :(得分:0)
这在Linux和Windows上都是可行的。您可能有另一个应用程序(可能是您的应用程序的先前版本,它没有终止)运行并使用相同的端口。