InputStream read () блокирует, когда сервер не возвращает ввода - PullRequest
0 голосов
/ 03 января 2012

Я работаю над программой для 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;
}

1 Ответ

0 голосов
/ 03 января 2012

Чтение и запись должны выполняться в отдельных потоках. read () - это метод блокировки, который ожидает получения данных с сервера.

...