【问题标题】:how to tell whether a connection is established in java?如何判断java中是否建立了连接?
【发布时间】:2012-04-16 18:40:32
【问题描述】:

我试图在 android 的两个模拟器之间建立一个套接字通道。我写了以下代码:

    public SocketChannel connect2node(String ip, int port) {
        SocketChannel client = null;
        try {
            client = SocketChannel.open(new InetSocketAddress(ip, port));
            client.configureBlocking(false);
            client.register(selector, SelectionKey.OP_READ);

            if (!client.isConnected()) {
                Log.i("server connection", "error");
                return null;
            }
        } catch (IOException e) {
            String s = e.getMessage();
            e.printStackTrace();
        }

        return client;
    }

注意我没有在(ip,端口)中启动另一个模拟器,这意味着连接总是会失败。当我开始调试上面的代码时,发现到了

    if (!client.isConnected()) {

然后跳转到catch块:

     e.printStackTrace();

catch 块中的所有其他行都不执行,返回时客户端不为空。那么如何判断连接是否建立成功呢?

【问题讨论】:

  • 堆栈跟踪说明了什么?
  • 它什么也不打印。我认为它也跳过了e.printStackTrace()
  • 不可能。我建议你重新编译并重新测试。另见我的回答。

标签: java android nio socketchannel


【解决方案1】:

isConnected() 测试毫无意义。如果 open() 连接失败会抛出异常。

【讨论】:

  • open() 成功,代码继续运行,直到 isConnected() 抛出异常。
  • @zwx 是的,我在你的问题中读到了。丝毫不影响我的回答。只需删除测试。这是徒劳的。在代码中的那个点,套接字不能处于非连接状态。
  • 是的,你是对的。在我删除 isConnected() 测试后,它不会抛出异常并且运行良好。但我的问题是如何判断连接是否建立?因为client是作为非空值返回的,所以我无法将其与连接成功区分开来。
  • @zwx 我刚刚回答了两次: (1) '如果 open() 连接失败,它将抛出异常' (2) '此时套接字不能未连接代码中'.open() 没有抛出异常,所以通道是连通的,继续依次执行。这就是为什么下面的测试是徒劳的。
  • 感谢您的解释,但我的问题与此无关。由于 (ip, port) 处的远程仿真器可能正在运行或尚未启动,我需要一种方法来知道仿真器是否正在侦听或未准备好。如果模拟器没有监听,我希望连接会失败,否则成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2013-12-31
  • 2012-04-18
  • 2012-05-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多