请给我建议如何增加我的ByteBuf初始容量。
在这样的情况下:
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
byte[] byteinput = new byte[in.readableBytes()];
in.readBytes(byteinput);
//further handling...
}
如果收入消息超过ByteBuf的最大容量 - 我得到切割数据。对于这个项目来说,获得完整的,非分块的信息至关重要。
我想我需要在bootstraps childOptions中的某个位置设置ByteBuf的初始容量,或者在ChannelInitializer内部的cannel.config()中设置初始容量。
我尝试了不同的方式,如设置
ch.config().setReceiveBufferSize(1024)
但我仍然具有相同的ByteBuf容量值(例如496)。
UPD
我通过wireshark发现了我的协议流量,并且来自我的测试用户客户端的高达1,4k的数据包未被破坏。此问题仅与netty设置有关。操作系统套接字缓冲区不会删除消息。
答案 0 :(得分:5)
这很简单。
ServerBootstrap b = new ServerBootstrap(); // (2)
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class) // (3)
.childHandler(new ChannelInitializer<SocketChannel>() { // (4)
@Override
public void initChannel(SocketChannel ch) throws Exception {
//decrypt //checknum
ch.config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(2048)); //set buf size here
ch.pipeline().addLast(new InboundDecryptor());
.
.
.
答案 1 :(得分:1)
您可以配置Netty的缓冲区分配大小,但可能会受到更多常规限制。 Netty是一个异步框架。这意味着它将读取操作系统可用的内容并将其传递给您。 Netty无法控制网络状况,网络硬件行为,操作系统行为或您的数据生产商与Netty应用程序之间的任何其他内容。如果您的应用程序逻辑需要完整的应用程序级别消息,则可能必须在调用此应用程序逻辑之前聚合数据。 Netty有一些方便的方法来帮助解决这个问题,请参阅MessageAggregator.java,对于HTTP特定的实现,请参阅HttpObjectAggregator.java。
答案 2 :(得分:0)
ch.config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(2048));
对于HTTP请求,它也应该使用HTTPObjectAggregator
。它对我有用。