2014-10-30 134 views
1

请给我建议如何增加我的ByteBuf初始容量。
在情状: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或者ChannelInitializer的cannel.config()里面设置ByteBuf的初始容量。
,我尝试不同的方式,如设置

ch.config().setReceiveBufferSize(1024) 

,但我仍然有能力ByteBuf(例如496)相同的值。

UPD

我发现我的协议流量使用Wireshark,并包达1,4k从我的测试用户的客户端会两袖清风出来英寸这个问题只是netty设置的问题。操作系统套接字缓冲区不会剪切消息。

+0

“接收缓冲区大小”是内核中套接字接收缓冲区的大小。与Netty,NIO或Java无关。 – EJP 2014-10-31 04:49:59

+0

这是真的。但是对于我现在的机器来说,输入套接字缓冲区至少是8k。我的消息削减为498字节。当我查看ByteBuf实例字段时,我看到“(max)capacity = 498”。我需要找到这个ByneBuf的工厂或初始设置,并改变它的初始容量。 林不想发送1MB在一块,我只需要1k – Asprelis 2014-10-31 08:45:52

回答

3

这很简单。

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

您可能可以配置Netty的缓冲区分配大小,但可能存在更多的一般限制。 Netty是一个异步框架。这意味着它将读取操作系统提供给它的任何内容,并将其传递给您。 Netty无法控制网络状况,网络硬件行为,操作系统行为或数据生成者与Netty应用程序之间的任何其他内容。如果您的应用程序逻辑需要完整的应用程序级消息,则可能必须在调用此应用程序逻辑之前汇总数据。 Netty有一些便利的方法可以帮助我们看到MessageAggregator.java和HTTP特定的实现请参阅HttpObjectAggregator.java

+0

Intresting链接。
我的应用程序将接收小于最大TCP数据包大小(1400字节)但超过400字节的数据包。所以我想我的信息不会被分块。我只需要增加收入ByteBuf大小 – Asprelis 2014-10-31 08:35:01

+0

你的“假设”术语表明你不确定?如果你提供一些更多的细节和参考资料,告诉他们你如何知道你的消息不会被分块,这可能对他人有帮助。描述您的环境也可能是相关的(例如,这是通过普通互联网还是处于受控环境中,您的客户端/服务器是否只支持特定的操作系统)。 – 2014-10-31 15:08:15

+0

据我所知,现在我无法测试系统的所有可能的配置,我需要记住可能的问题。 这就是为什么我说“假设”,不要断言它,因为我可能不知道一些陷阱。 我查看wireshark(程序精确监测网络)列表来检查任何TCP数据包到我的服务器端口。服务器和客户端通过外部网络连接。所以wireshark表明,大包(1,4 kB)是整体来的。适用于Windows 7 x64和Android 3+系统; 我开始尝试使用服务器/通道初始化器不同部分的参数。 – Asprelis 2014-11-01 10:12:26

0

斯科特是对的。只增加缓冲区的大小并不能解决问题。

ch.config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(2048)); 

对于HTTP请求,它也应该使用HTTPObjectAggregator。它为我工作。