Поведение чтения () SocketChannel - короткое чтение - PullRequest
0 голосов
/ 20 ноября 2011

ServerSocketChannel используется следующим образом:

ServerSocketChannel srv = ServerSocketChannel.open();
srv.socket().bind(new java.net.InetSocketAddress(8112));
SocketChannel client = srv.accept();

При получении соединения данные читаются следующим образом:

ByteBuffer data = ByteBuffer.allocate(2000);
data.order(ByteOrder.LITTLE_ENDIAN);
client.read(data);
logger.debug("Position: {} bytes read!", data.position());

Он печатает:

Позиция: 16 байтов прочитано!

Почему SocketChannel не блокируется, пока буфер не заполнится?
Из ServerSocketChannel.accept() API (Java 7):

Канал сокета, возвращаемый этим методом, если он есть, будет в режим блокировки независимо от режима блокировки этого канала.

Блокирует ли write(ByteBuffer buffer) SocketChannel? Как мне это проверить?

Спасибо за ваше время!

1 Ответ

3 голосов
/ 20 ноября 2011

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

Если вы хотите убедиться, что вы получили весь набор данных, вы должны read() в цикле, пока вы не заполните свой буфер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...