netty - 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());
将相互配对的通道CopyHandler
。write()
解决方案
一般来说,应该可以将其调整到位。我怀疑您可能会在多次写入相同的缓冲区(或共享相同存储的不同缓冲区)时看到问题。
推荐阅读
- java - 如何在 OS X 上连接 Eclipse 和 JPL
- netsuite - 单击 Suitelet 中的按钮后如何从函数返回值
- mysql - 我想向客户销售固定数量的产品。如何在春季 jpa 中管理并发?
- microcontroller - vTaskStartScheduler() 后无法读取中断优先级
- c - C - strcspn() 函数跳过数组中较长的字符串
- c - 如何在C中小数点后的有效数字后添加零?
- sql - SQL 执行速度很慢 我怎样才能加快速度?
- google-analytics - Google Analytics 生成的事件流报告中的最终事件是什么
- c# - 使用 DataRowExtension 解析 TimeSpan
- delphi - 如果我只想停止执行并报告错误,在 Delphi TDataSetProvider.OnUpdateError 中该怎么办?