我有一台Android设备,它将运行其他Android设备(客户端)将要连接的服务器。我在非阻止模式下使用SocketChannel
和ServerSocketChannel
。
以下是我在服务器设备上初始化ServerSocketChannel的代码: ServerSocketChannel serverSocketChannel; ServerSocket 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绑定到环回地址,导致客户端连接失败。这是导致客户超时的问题吗?如果是,我该如何解决?
答案 0 :(得分:2)
这是一种可能性。 InetAddress.getLocalHost().getHostAddress()
可以返回127.0.0.1
或::1
或服务器本地的任何其他IP地址。
只需传递null
而不是此值:这相当于INADDR_ANY
,它允许服务器通过其任何接口接受连接。