ByteBuf初始容量大小

时间:2014-10-30 20:48:29

标签: java netty

请给我建议如何增加我的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设置有关。操作系统套接字缓冲区不会删除消息。

3 个答案:

答案 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。它对我有用。