0

我正在编写一个连接到身份验证服务器的 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()查找程序挂起的位置。第一个调用执行,但第二个没有。此代码段是否有任何原因会导致应用程序冻结?

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

4

1 回答 1

0

两种可能。

  1. connect() 调用正在超时,这大约需要一分钟,具体取决于平台。这基本上意味着目标无法访问。您可能想回顾一下为什么会这样。如果您无法控制此代码将连接到的目标,则应先将通道置于非阻塞模式,然后连接,然后为 OP_CONNECT 注册通道。如果你走这条路,还有更多,如果需要,我会添加。

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

于 2013-05-28T03:12:50.573 回答