在connect()中阻止Android

时间:2013-05-28 02:08:40

标签: java android sockets nio socketchannel

我正在编写一个连接到身份验证服务器的Android应用,以检索运行单独服务器程序的另一个Android设备的IP地址和端口。验证服务器在发送请求时发送正确的连接信息。问题是客户端设备尝试连接到Android服务器。客户端获取正确的信息并成功关闭以前的连接,但在尝试创建新连接时挂起。没有异常被抛出,但UI没有响应,设备最终说应用程序没有响应。我有一个充当客户端设备的模拟器和一个充当服务器的实际手机。

以下是客户端代码的一部分:

Log.i("Socket", "About to open a new socket");
socketChannel = SocketChannel.open(new InetSocketAddress(ip, port));
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
Log.i("Socket", "New socket created and registered");

ip是String,包含服务器的IP地址。 port是服务器的端口号。我有两次调用Log.i()来查找程序挂起的位置。第一个调用执行,但第二个调用不执行。是否有任何理由认为此代码段会导致应用冻结?

如果需要,我可以发布更多代码,但我很确定问题出在上面提供的细分中。

1 个答案:

答案 0 :(得分:0)

两种可能性。

  1. connect()调用正处于超时阶段,大约需要一分钟,具体取决于平台。这基本上意味着目标无法进入。您可能想要查看原因。如果您无法控制此代码将连接到的目标,则应将通道置于非阻塞模式,首先进行连接,然后将通道注册为OP_CONNECT。如果沿着这条路走下去,还有更多内容,如果要求我会添加。

  2. 你有一个Selector在不同的线程中运行,它目前在select()中被阻塞,这将阻止你调用register()。这种情况下的解决方案是在调用register()之前唤醒选择器,并确保选择器线程正确处理select()的零返回。