Socket, BufferedReader зависает в readLine()

У меня есть сервер, который изначально делает это: -

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
for (;;) {
  String cmdLine = br.readLine();
  if (cmdLine == null || cmdLine.length() == 0)
     break; 
  ...
}

позже он передает сокет другому классу "foo" Этот класс ожидает сообщений, специфичных для приложения.

 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
 appCmd=br.readLine();

Мой клиент отправляет эту последовательность:

  • "бар\п"
  • "как u?\n"
  • "\ п"
  • ", передавая его foo\n"
  • "\ п"

Проблема в том, что иногда "foo" не получает ответа. Он зависает в readLine().

Какова вероятность того, что readLine() на сервере буферизует данные с помощью чтения вперед, а класс "foo" становится голодным?

Если я добавляю сон на стороне клиента, он работает. Но какова вероятность того, что он всегда будет работать?

  • "бар\п"
  • "как u?\n"
  • "\ п"
  • sleep(1000);
  • ", передавая его foo\n"
  • "\ п"

Как устранить проблему? Оцените любую помощь в этом отношении.

Ответ 1

Решение

eee отлично работает. Я пытался читать вывод из сеанса SMTP, но он блокировал бы:

while ((response = br.readLine()) != null) {
    ...Do Stuff
}

Переход на:

while (br.ready()) {
    response = br.readLine();
    ...Do Stuff
}

Я могу все прочесть. br - объект BufferedReader, BTW.

Ответ 2

Есть данные уже в первом BufferedReader (который был прочитан из сокета и больше не доступен из сокета), поэтому передайте BufferedReader, созданный в первом примере, классу, который читает приложение а затем создайте новый BufferedReader из сокета.