Подтвердить что ты не робот

Розетки: блокировки readered() BufferedReader

Я использую метод 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 блокирует? Как обычно сервер сигнализирует о завершении потока? Спасибо.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

while((line = br.readLine())!=null && line.length() > 0) {
   // ...
}