我正在使用Akka IO中的TCP建立TCP连接。我有一个TCP套接字侦听127.0.0.1端口2001,我正在尝试连接到该套接字,但是从地址为192.168.101.20的网络接口,这是我的以太网适配器的(本地)地址。当我在Linux操作系统上执行此操作时,一切正常;我可以创建一个连接,我可以发送和接收消息。但是,当我在Windows(7)操作系统上执行此操作时,我似乎无法获得连接。我得到的只是以下例外:
java.net.BindException:无法分配请求的地址:无更多信息
自从我第一次遇到Akka IO模块以来,我提取了负责建立连接的Java代码,并将其调整为在一个简单的主类中运行:
final InetSocketAddress remoteAddress = new InetSocketAddress("127.0.0.1", 2001);
final InetSocketAddress localAddress = new InetSocketAddress("192.168.101.20", 0);
new Thread(() -> {
try {
final Socket socket = new ServerSocket(remoteAddress.getPort(), 100,
remoteAddress.getAddress()).accept();
System.out.println("Connection astablished with ["
+ socket.getInetAddress() + "]");
} catch (IOException ex) {
}
}).start();
System.out.println("Attempting connection to [" + remoteAddress + "]");
/* Code making a connection */
final SocketChannel channel = (SocketChannel) SocketChannel.open()
.configureBlocking(false);
channel.socket().bind(localAddress);
if (!channel.connect(remoteAddress)) {
int retries = 3;
while (!channel.finishConnect() && --retries > 0) { // Throws BindException
Thread.sleep(100);
}
if (retries == 0) {
throw new IOException("Could not establish connection");
}
}
注意:可能需要更改本地地址,具体取决于以太网适配器的地址。
这也可以通过使用简单的Socket
实现来显示:
/* Code making a connection */
final Socket socket = new Socket();
socket.bind(localAddress);
socket.connect(remoteAddress); // Throws ConnectException
java.net.ConnectException:connect:本地计算机上的地址无效,或者端口在远程计算机上无效
任何人都知道为什么这适用于Linux,但不适用于Windows?