2015-04-13 7 views
0

В java NIO, Selector.select() гарантирует, что на канале Socket Channel доступно по крайней мере одно полное содержимое датаграммы UDP, или в теории. Селектор может проснуться, когда есть меньше дейтаграммы, скажем, пару байтов?Nio Selector.select IO готовность

Что произойдет, если транспортный протокол TCP, в отношении Selector.select(), есть ли разница с UDP?

От API: Выбирает набор ключей, соответствующие каналы которых готовы для операций ввода-вывода.

Он, однако, не указывает, какие готовые средства.

Так мои вопросы:

  • как входящие датаграммы/потоки идут от аппаратных средств к прикладной сокет Java (Channels).

  • при использовании UDP или TCP-клиента, следует ли предположить, что получена хотя бы одна датаграмма или может быть активирован Selector, если имеется только часть дейтаграммы?

ответ

2

Это, однако, не указать, какие готовые средства.

Так мои вопросы:

  • как входящие пакеты/потоки идут от аппаратных средств к прикладной сокет Java (Channels).

Они прибывают в NIC, где они помещаются в буфер и затем передается в стек сетевых протоколов, а оттуда к гнезду приемного буфера. Оттуда они извлекаются при вызове read().

  • при использовании UDP или TCP клиент должен один предположить, что по крайней мере один пакет получен

Вы имеете в виду пакет. На самом деле в случае UDP вы имеете в виду датаграмма. Вы можете предположить, что в случае UDP была получена целая датаграмма.

или Selector может проснуться, когда имеется только часть [пакета]?

В случае TCP можно предположить, что либо по крайней мере один байт или конец потока доступен. На уровне TCP нет такой вещи, как «пакет» или «пакет» или «сообщение».

+0

Благодарим за четкий ответ. Да, я имел в виду датаграмму, THX для указания :). – John

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