Каков правильный способ непрерывного чтения сообщений сокета через DataInputStream?

Я пытаюсь создать клиент Java Bittorent. Насколько я понимаю, после рукопожатия сверстников друг с другом они могут начать отправлять сообщения друг другу, часто отправляя сообщения спорадически.

Используя соединение DataInputStream, я могу читать сообщения, но если я вызываю чтение, а в потоке ничего нет, пиры удерживают. Есть ли способ узнать, отправляется ли что-то через поток? Или мне следует создать новый поток, который непрерывно считывает поток сообщений от каждого узла, пока клиент не отключит их?


person Philip Rego    schedule 03.04.2014    source источник


Ответы (3)


Я думаю, вам нужно провести несколько серьезных экспериментов, чтобы вы могли начать изучать основы ввода-вывода сокетов. Попытка ответить на ваш вопрос «как есть» затруднена, потому что вы еще недостаточно понимаете, чтобы задать вопрос таким образом, чтобы на него можно было ответить.

Если вы хотите знать, есть ли данные для чтения, вам не следует использовать подход с блокирующим вводом-выводом. Вместо этого вам нужно будет использовать API-интерфейсы, известные как «NIO», которые позволяют вам «выбрать» сокет, в котором есть данные для чтения (т. е. сокет, связанный с буфером, в котором уже есть данные).

Это будет иметь гораздо больше смысла после того, как вы напишете много кода и несколько раз испортите его. Базовые примитивы ввода-вывода на самом деле довольно примитивны (каламбур). В этой отрасли мы просто придумали множество сложных терминов, названий функций и описаний API, чтобы люди думали, что сетевое общение — это волшебство. Это не. Обычно это не сложнее, чем memcpy().

person cpurdy    schedule 03.04.2014

В C есть функция, называемая select(). В описанном вами сценарии вам нужен эквивалент select в Java. И это, как упомянул cpurdy, неблокирующий ввод-вывод сокетов или NIO. Беглое гугление выдало следующие ссылки:

person bytefire    schedule 24.04.2014

Вы можете взглянуть на проект Netty: http://netty.io/

С Netty очень легко начать сетевое программирование.

person Wim Deblauwe    schedule 24.04.2014