【问题标题】:Android blocking in connect()Android 在 connect() 中阻塞
【发布时间】:2013-05-28 02:08:39
【问题描述】:

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

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

【问题讨论】:

    标签: java android sockets nio socketchannel


    【解决方案1】:

    两种可能性。

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

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

    【讨论】:

    • 选择器与连接在同一个线程中,所以不是这样。调用 connect() 超时的一些可能原因是什么?如果有帮助,我有目标设备的代码。
    • 我回到连接代码,添加了更多的Log.i()语句,并将打开和连接更改为不同的行。在 connect() 时它肯定会挂起
    • 所以情况(1)适用。设备或中间网络没有响应(即使存在路由),
    • 您对我如何找到问题有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2017-07-15
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多