【问题标题】:InputStream read() blocks when server returns no input当服务器没有返回输入时 InputStream read() 阻塞
【发布时间】:2012-01-03 21:13:00
【问题描述】:

我正在开发一个 Android 程序,它通过 SSH 连接到服务器以获取一些数据。

问题是,如果一个命令被发送到服务器,它不返回任何东西(例如空文件上的 cat),我的程序挂起,似乎被 in.read() 阻止。

我在行上有一个断点

if ((read = in.read(buffer)) != -1){

以及它下面的 then/else 行。如果我调试它,程序会在 if 语句上正常中断,但是当我点击继续时,程序会再次挂起,并且永远不会进入下一个断点。

如果程序确实从服务器得到响应,它会正常工作,但如果服务器不能正常合作,我想保护我的程序不被挂起。

我正在使用 J2SSH 库。

public String command(String command) {
    command = command + "\n";

    if (session.getSessionType().equals("Uninitialized") || session.isClosed()) {
        openShell();
    }

    OutputStream out = session.getOutputStream();
    InputStream in = session.getInputStream();


    byte buffer[] = new byte[255];
    int read;
    String in1 = null;
    String fullOutput = "";

    try {
        try {
            out.write(command.getBytes());
        } catch (IOException e){
            Log.e(TAG,"Error writing IO stream");
            e.printStackTrace();
        }
        boolean retrivingdata = true;
        while (retrivingdata){
            String iStreamAvail = "Input Stream Available "+ in.available();

            if ((read = in.read(buffer)) != -1){
                retrivingdata = true;
            } else {
                retrivingdata = false;
                return null;
            }

            in1 = new String(buffer, 0, read);
            fullOutput = fullOutput + in1;

            if (read < 255){
                break;
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return fullOutput;
}

【问题讨论】:

标签: java android ssh inputstream j2ssh


【解决方案1】:

读和写应该在不同的线程中完成。 read() 是一种阻塞方法,它一直等到服务器提供数据。

【讨论】:

  • 即使我在单独的线程中运行它,该线程也将永远继续等待响应。
  • 这就是套接字的工作原理。如果您想在超时后解锁威胁,也可以查看以下套接字选项:developer.android.com/reference/java/net/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2015-09-15
  • 1970-01-01
  • 2013-08-02
  • 2013-01-05
相关资源
最近更新 更多