首页 > 解决方案 > netty:如何就地编辑 bytebuf 的后端数组?

问题描述

在我的用例中,我需要在读取或写入网络之前对每个字节进行异或。所以我实现了一个双工处理程序来做到这一点。

但奇怪的是我无法就地编辑输出 bytebuf,而读取端可以:

@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
    ByteBuf buf = (ByteBuf) msg;
    ByteBuf res = buf.alloc().buffer(buf.readableBytes());
    buf.forEachByte(value -> {
        res.writeByte(value ^ cookie);
        return true;
    });
    buf.release();
    super.write(ctx, res, promise);
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    ByteBuf buf = (ByteBuf) msg;
    buf.forEachByte(new ByteProcessor() {
        private int i = 0;

        @Override
        public boolean process(byte value) throws Exception {
            buf.setByte(i++, value ^ cookie);
            return true;
        }
    });
    super.channelRead(ctx, msg);
}

请注意,从其先前的处理程序write()中确保了 msg 参数的类型。ByteBuf

如果我在write().内容),所以我必须回退复制缓冲区进行编辑,这是一种缓慢的方式,对吧?

中的 bytebuf 有什么特别之处write()吗?

编辑:

代理服务器将两个通道作为一对处理,即入站通道和出站通道,以及它们之间的代理数据。

入站通道的管道:

ch.pipeline().addLast("ReadTimeoutHandler", new ReadTimeoutHandler(30));
ch.pipeline().addLast("WriteTimeoutHandler", new WriteTimeoutHandler(30));
cookie.ifPresent(c -> ch.pipeline().addLast(new FuzzHandler(c)));
ch.pipeline().addLast(new CopyHandler());

出站渠道管道:

ch.pipeline().addLast(new CopyHandler());

将相互配对的通道CopyHandlerwrite()

标签: nettybytebuffer

解决方案


一般来说,应该可以将其调整到位。我怀疑您可能会在多次写入相同的缓冲区(或共享相同存储的不同缓冲区)时看到问题。


推荐阅读