netty ByteBuf 损坏

问题描述 投票:0回答:1

我正在使用 ByteToMessageDecoder

decode(ChannelHandlerContext ctx, ByteBuf bytebuf, List<Object> out) {
...
}

我想对传入的字节缓冲区执行一些验证,然后将

bytebuf.nioBuffer()
发送到
out

  1. 我是否必须复制
    bytebuf.nioBuffer()
    并添加到输出中。如果是这样,最好的方法是什么
  2. 如果我只是将
    bytebuf.nioBuffer()
    添加到输出中,是否会有损坏的机会
  3. 从 netty ByteBuf 中提取 ByteBuffer 的最佳方法,是否有可用的实用程序
java netty nio bytebuffer
1个回答
0
投票

如果没有足够的数据来读取完整的消息,则调用重置方法。

你不需要复制bytebuf。 这对性能不利。

public class MyComplexByteToMessageDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> out) throws Exception {
        // Mark the current read position
        byteBuf.markReaderIndex();

        // Check if there are enough bytes to read the length field (e.g., 4 bytes for an integer length)
        if (byteBuf.readableBytes() < 4) {
            byteBuf.resetReaderIndex();
            return; // Not enough data to read the length field
        }

        // Read the length field
        int length = byteBuf.readInt();

        // Check if enough bytes are available to read the complete message
        if (byteBuf.readableBytes() < length) {
            byteBuf.resetReaderIndex();
            return; // Not enough data to read the complete message
        }

        // Read the complete message (assuming it is a byte array)
        byte[] messageBytes = new byte[length];
        byteBuf.readBytes(messageBytes);

        // Decode the message and add to the output list
        String message = new String(messageBytes); // Example: decoding as a string
        out.add(message);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.