Мне нужно в сокет отправить строку. При этом, в пакете вначале должно идти длина пакета в байтах.
Пишу такой код
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. А как его корректно и быстро посчитать - не знаю.
Или оставить как есть, с отправкой двух пакетов?
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости