Как правильно непрерывно читать сообщения сокетов через DataInputStream?
Я пытаюсь построить клиент Java Bittorent. Из того, что я понимаю после рукопожатия пиров друг с другом, они могут начать отправлять сообщения друг другу, часто отправляя сообщения время от времени.
Используя соединение DataInputStream, я могу читать сообщения, но если я вызываю чтение, и в потоке ничего нет, одноранговые узлы удерживаются. Есть ли способ, которым я могу сказать, если что-то отправляется через поток? Или я должен создать новый поток, который будет непрерывно считывать поток сообщений от каждого узла, пока клиент не выключит их?
3 ответа
Я думаю, что вам нужно провести несколько крупных экспериментов, чтобы вы могли начать изучать основы сокет ввода-вывода. Попытка ответить на ваш вопрос "как есть" затруднена, потому что вы еще недостаточно понимаете, чтобы задать вопрос таким образом, чтобы на него можно было ответить.
Если вы хотите узнать, есть ли данные для чтения, вам не следует использовать блокирующий подход ввода-вывода. Вместо этого вам нужно будет использовать API-интерфейсы, известные как "NIO", которые позволяют "выбирать" сокет, в котором есть данные для чтения (т. Е. Сокет, связанный с буфером, в котором уже есть данные).
Это будет иметь больше смысла после того, как вы напишете много кода и перепутаете его несколько раз. Базовые примитивы ввода / вывода на самом деле довольно примитивны (каламбур). В этой отрасли мы только что составили множество сложных терминов, названий функций и описаний API, чтобы люди думали, что сетевое общение - это волшебство. Это не. Обычно это не сложнее, чем memcpy().
Возможно, вы захотите взглянуть на проект Netty: http://netty.io/
С Netty очень легко начать сетевое программирование.
В С есть функция, которая называется select()
, В сценарии, который вы описали, вам нужен эквивалент select
на Яве. И это, как упомянуто cpurdy, неблокирующее гнездо ввода / вывода или NIO. Краткий гугл вернул следующие ссылки: