java.net.BindException:无法分配请求的地址:没有进一步的信息

时间:2016-05-20 09:36:34

标签: java linux windows sockets tcp

我正在使用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?

0 个答案:

没有答案