我有一个 Android 设备,它将运行一个服务器,其他 Android 设备(客户端)将连接到该服务器。我在非阻塞模式下使用
SocketChannel
和 ServerSocketChannel
。
这是我在服务器设备上初始化 ServerSocketChannel 的代码: ServerSocketChannel serverSocketChannel; ServerSocket 服务器套接字;
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());
当客户端设备尝试连接到服务器设备时,连接超时并抛出带有空消息的 ConnectException。我调用
Log.i()
来检查 ServerSocket 绑定的 IP 地址。当代码执行时,输出显示 IP 地址是“127.0.0.1”。我在普通的 Java 应用程序中尝试了该代码,它打印了计算机的内部 IP 地址。当我的服务器在计算机上运行时,客户端连接成功。
我认为问题在于ServerSocket绑定到环回地址,导致客户端连接失败。这是导致客户端超时的问题吗?如果是的话我该如何解决?
InetAddress.getLocalHost().getHostAddress()
应返回 127.0.0.1
或 ::1
或服务器本地的任何其他 IP 地址。
只需传递
null
而不是此值:这相当于 INADDR_ANY
,它允许服务器通过其任何接口接受连接。