Мне нужно в сокет отправить строку. При этом, в пакете вначале должно идти длина пакета в байтах.
Пишу такой код
private static final CharsetEncoder encoder =
Charset.forName("UTF-8").newEncoder();
......
String data = .........
CharBuffer buf = CharBuffer.wrap(data);
ByteBuffer outBuf;
synchronized (encoder) {
outBuf = encoder.encode(buf);
}
outBuf.rewind();
ByteBuffer bufLen = ByteBuffer.allocate(Integer.BYTES);
bufLen.putInt(outBuf.remaining());
bufLen.rewind();
attachment.write(bufLen, (att1) ->
att1.write(outBuf, (att2) -> att2.read(this::readCompleted))
);
Т.е. вначале получаю в буфере содержимое строки, потом в отдельный буфер записываю длину, потом отправляю длину, а при успешной отправке отправляю сами данные.
Вопрос, можно ли как-то записать строку в существующий буфер? Про схему
encoder.reset();
encoder.encode(CharBuffer.wrap(data), buffer, true);
encoder.flush(buffer);
знаю. Но тогда нужно изначально выделить место под buffer
. А как его корректно и быстро посчитать - не знаю.
Или оставить как есть, с отправкой двух пакетов?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
На разметке активности есть ListView и EditTextПри вводе символов пользователем в ListView должны оставаться только объекты которые содержат введенные...
У меня есть JSON, который нужно прочитать в объект при помощи ObjectMapperВыглядит это так: