1

我有一台 Android 设备,它将运行其他 Android 设备(客户端)将连接到的服务器。我正在使用SocketChannel并且ServerSocketChannel处于非阻塞模式。

这是我在服务器设备上初始化 ServerSocketChannel 的代码: ServerSocketChannel serverSocketChannel; 服务器套接字服务器套接字;

        InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), 10000);

        serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.configureBlocking(false);

        serverSocket = serverSocketChannel.socket();
        serverSocket.bind(address);

        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        Log.i("AdminNetwork", serverSocket.getInetAddress().getHostAddress());

当客户端设备尝试连接到服务器设备时,连接超时并抛出带有 null 消息的 ConnectException。我调用 toLog.i()检查 ServerSocket 绑定的 IP 地址。当代码执行时,输出显示 IP 地址为“127.0.0.1”。我在一个普通的 Java 应用程序中尝试了代码,它打印了计算机的内部 IP 地址。当我在计算机上运行服务器时,客户端连接成功。

我认为问题在于 ServerSocket 绑定到环回地址,导致客户端连接失败。这是导致客户端超时的问题吗?如果是我该如何解决?

4

1 回答 1

2

这是一种可能。InetAddress.getLocalHost().getHostAddress()可以返回127.0.0.1或返回::1服务器本地的任何其他 IP 地址。

只需传递null而不是这个值:这相当于INADDR_ANY,它允许服务器通过其任何接口接受连接。

于 2013-05-30T00:13:39.923 回答