Ответ Java Server не распечатывается должным образом - PullRequest
0 голосов
/ 15 ноября 2010

Я строю простую клиент-серверную программу, у меня в основном:

FTPClient ftp = new FTPClient("www.kernel.org");
ftp.getReply();
ftp.sendCommand("USER " + "anonymous");
ftp.getReply();
ftp.sendCommand("PASS " + "anonymous");
ftp.getReply();
String com="";
while (!com.equalsIgnoreCase("quit")){
    System.out.println("Enter your Commands . or Enter quit");
    BufferedReader Keyboard = new BufferedReader(new InputStreamReader(System.in));
    com = Keyboard.readLine();
    ftp.sendCommand((com));
    ftp.getReply();
    System.out.println("===============");
}
ftp.close();

проблема в функции getReply (), эта функция:

public void getReply() throws IOException {
    String line="";
    while (br.ready())
    {
        line = br.readline();
        System.out.println(line);
        System.out.flush();
    }
}

br - это BufferedReader.
Теперь вся проблема в том, что при запуске программы она не показывает приветственное сообщение с сервера, пока я не нажму Enter или любую команду, когда я отлаживаю программу Шаг за шагом все работает отлично. Так что проблема в readline, и я должен использовать что-то еще или что?

1 Ответ

1 голос
/ 15 ноября 2010

Возможно, проблема в том, что конец ответа сервера не содержит символа новой строки.Метод readLine в BufferedReader будет блокироваться до тех пор, пока не будет получена строка данных, где «строка» состоит из нескольких символов , за которыми следует символ новой строки (или конец потока).Следовательно, вызов readLine не вернется, если новая строка не получена.

В этом случае BufferedReader не приносит вам никакой пользы.Было бы лучше, если бы вы сами использовали базовый Reader, читая в массив и выдавая вывод, как только он поступил, например:

final char[] buffer = new char[256]; // or whatever size you want
int nRead;
while ((nRead = reader.read(buffer)) != -1)
{
    System.out.println(new String(buffer, 0, nRead));
    System.out.flush();
}

Условие в цикле whileможет показаться запутанным, если вы не привыкли к нему раньше, но он объединяет операцию чтения (которая читает в буфер) с проверкой того, что конец потока не достигнут.Аналогично, конструкция String внутри цикла while учитывает тот факт, что буфер, возможно, не был заполнен не полностью, поэтому используется только столько символов, сколько было предоставлено.

Обратите внимание, что этот конкретный фрагментпродолжает цикл, пока поток не станет пустым;Вы можете добавить еще одно условие выхода в вашем конкретном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...