我有一个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());
当客户端设备试图连接到服务器设备时,连接超时并抛出带有空消息的ConnectException。我把呼叫Log.i()
来检查ServerSocket绑定到的IP地址。当代码执行时,输出显示IP地址为'127.0.0.1'。我在一个普通的Java应用程序中尝试了这个代码,它打印了计算机的内部IP地址。当服务器在计算机上运行时,客户端连接成功。
我认为问题是ServerSocket绑定到loopback地址,导致客户端连接失败。这是导致客户端超时的问题吗?如果是,我该如何修复它?
有可能。InetAddress.getLocalHost().getHostAddress()
可以返回127.0.0.1
或::1
或任何其他本地IP地址到服务器。
只传递null
而不是这个值:这相当于INADDR_ANY
,它允许服务器通过任何接口接受连接。