Сокеты: блоки BufferedReader readLine () - PullRequest
12 голосов
/ 26 мая 2011

Я использую метод BufferedReader.readLine() для чтения ответа с удаленного сервера (который написан на C, и у меня нет доступа к исходному коду).

BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while((line = br.readLine())!=null){
    [...]
}

Но он всегда блокируется в последнийлиния, пока не истечет время ожидания.Поэтому я использовал следующий код:

int b;
while(true){
   b = in.read;
   [...]
}

и обнаружил, что последний прочитанный байт имеет целочисленное значение 13, и я думаю, что это возврат каретки, верно?

почему блоки readLine метод?Как сервер обычно сообщает о достижении конца потока?Спасибо.

Ответы [ 4 ]

12 голосов
/ 26 мая 2011

В случае сетевого подключения поток прерывается при закрытии сокета.

Так что вполне нормально, что readLine() блокирует, пока не получит "конец строки" или вы не закроете соединение вручную.Когда ваш readLine() получает последний символ со значением '13', строка читается и цикл начинается снова, ожидая следующей строки.

Нет разницы между "последней строкой" идругие строки.

Чтобы остановить цикл, вы должны вручную где-то закрыть соединение или дождаться истечения времени ожидания.Но без дополнительной информации о вашем протоколе связи невозможно быть более точным об этом.

4 голосов
/ 26 мая 2011

Это зависит от протокола. Если сервер не закрывает поток, readLine будет блокироваться до тех пор, пока не будет получен правильный конец строки. Так что, если сервер никогда не отправляет правильный конец строки, вы заблокированы. Возможно, вам следует использовать более низкоуровневые методы и попытаться получить документацию по протоколу или перепроектировать ее.

2 голосов
/ 23 октября 2013

убедитесь, что в коде сервера есть out.println () вместо out.print ()

1 голос
/ 03 января 2014

Вы можете расширить условие while, если не используете пустые строки:

while((line = br.readLine())!=null && line.length() > 0) {
   // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...