Есть такой код
AsynchronousSocketChannel channel;
.......
ByteBuffer buf = ByteBuffer.allocate(1000);
channel.read(buf, buf, CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
if (result != -1)
System.out.println(attacment.hasRemaining());
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
// process error
}
});
и аналогичный для записи
ByteBuffer buf = ByteBuffer.allocate(1000);
..........
buf.rewind();
channel.write(buf, buf, CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
if (result != -1)
System.out.println(attacment.hasRemaining());
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
// process error
}
});
Вопрос - всегда ли эти методы будут выводить false или возможна ситуация когда прочитано/записано байт меньше, чем в буфере и операцию нужно будет повторить?
В случае метода read вам может прийти данных больше, чем есть места в буфере buf. В этом случае будет выведено true и понадобится повторное чтение.
В случае метода write, если ваш сервер генерирует поток данных достаточный, чтобы забить буферы отправки, может возникнуть ситуация, когда вы не сможете записать в канал содержимое buf полностью. Тогда будет будет выведено true и понадобится повторная запись.
Лучше всего писать код с учётом возможности неполной отправки и приёма данных.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости