2014-12-05 3 views
1

Я прочитал из потока, созданного Socket.getInputStream(). Когда я его использую, он блокируется, пока не получит новые данные (именно то, что он должен). Теперь мне нужно, чтобы поток читал что-то (см. Ниже). Но когда я начну читать новое, это даст мне неуказанный вывод (или нет?). Мой вопрос:Сеть блокировки прерываний IO без закрытия сокета

Как я могу прервать фактическое чтение, поэтому я могу использовать метод чтения?

Детали: Я подключаюсь к серверу и посылаю ему команды. Время от времени сервер отправляет сообщения моему клиенту (уведомления о событиях), которые мне нужно регистрировать. Я хочу иметь возможность отправлять команды, пока я жду этих сообщений. Когда я отправляю команду, ответ на эту команду считывается из потока. И вот проблема: я все еще слушаю сообщения, пока я пытаюсь прочитать мой ответ. Поэтому мне нужно что-то, что прерывает текущее чтение.

+1

при работе с блокировкой потоков, вам нужно использовать _separate threads_ для чтения и писать. – jtahlborn

ответ

1

Проблема с остановкой процессора событий от чтения заключается в том, что вы вводите условие гонки: Что произойдет, если сервер отправит событие сразу после того, как вы закончите чтение? «Ответ», который вы прочитали, станет событием.

Правильный способ сделать это - сделать все ваше чтение, как события, так и ответы, в одном месте и обработать ответы как событие. Перед отправкой команды зарегистрируйте прослушиватель для ответа, затем отправьте команду. Когда поток чтения видит ответ, найдет ли он правильный слушатель и сообщит, что ответ получен.

+0

Никогда не думал о добавлении listerner для синтаксического анализа команды. Теперь я отключил свои чтения из текущей темы и перевел их на слушателя. Спасибо за быструю помощь! – kaetzacoatl

0

Самый простой и эффективный способ обработки этой IMO - использовать асинхронный прослушиватель с обратными вызовами событий. DataFetcher is an implementation (Также см Timeout и PartialReadException, зависимость в том же проекте/пакете, и IOUtils, который имеет возможности для прямого подключения FetcherListener с InputStream)

Смежные вопросы