2015-10-06 2 views
0

Скажем, у меня есть ОДИН SocketChannel на сервере, ожидающем, когда OP_READ станет готовым, и ONE SocketChannel на клиенте, который использует ОДИН вызов записи в буфере для отправки данных на сервер. Гарантируется ли тогда, что OP_READ будет готов только после того, как все данные, которые отправил клиент, прибыли?OP_READ готов только тогда, когда SocketChannel.write() завершает?

ответ

1

Следует ли гарантировать, что OP_READ будет готов только после того, как все данные, отправленные клиентом, прибыли?

Короткий ответ: нет.

Длинный ответ:

Приемный канал будет готов, как только по крайней мере один байт доступен для чтения. Байты, как правило, становятся доступными более чем по одному, но, как правило, нет никакой гарантии, что общий буфер, заполненный байтами, будет разделен, и, конечно же, никто, что все байты не поступят до готовности канала приема. Данные могут быть разделены в нескольких точках как на стороне записи, так и на стороне чтения. Это имеет мало общего с количеством отправителей, количеством получателей или конфликтом ресурсов.

Данные зависят от некоторой степени от базового сетевого протокола - например, почти все ставки отключены для протокола типа потока, такого как TCP, но протокол типа дейтаграммы, такой как UDP, должен дать вам вид вы, похоже, хотите. В частности, UDP не гарантирует гарантированную доставку, поэтому в этом случае у вас есть разные проблемы. Абстракция канала лучше подходит для протокола потока.

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