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
из сокета.