ByteBuf 初始容量大小

4

请告诉我如何增加我的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的最大容量,我将会收到截断数据。对于这个项目来说,获取完整的非分块消息非常重要。
我想我需要在引导程序的childOptions或者channel.config()中设置ByteBuf的初始容量... 在ChannelInitializer中。
我尝试了不同的方法,比如设置...
ch.config().setReceiveBufferSize(1024)

但是我仍然拥有相同的ByteBuf容量值(例如496)。

更新

我通过使用wireshark发现我的协议流量,测试用户客户端可以发送和接收高达1.4k的数据包而不会出现损坏。这个问题只涉及到netty的设置。操作系统套接字缓冲区不会截断消息。


“接收缓冲区大小”是内核中套接字接收缓冲区的大小。与Netty、NIO或Java无关。 - user207421
没错。但是对于我的当前机器,输入套接字缓冲区至少为8k。我的消息在498个字节处截断。当我查看ByteBuf实例字段时,我看到“(max)容量=498”。我需要找到工厂或初始设置的ByneBuf,并更改其初始容量。 我不是试图一次发送1MB,我只需要1k。 - Asprelis
3个回答

6
那真是易如反掌。
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

有趣的链接。</br> 我的应用程序将接收小于最大TCP数据包大小(1400字节)但大于400字节的数据包。因此,我认为我的消息不会被分块传输。我只需要增加输入ByteBuf的大小即可。 - Asprelis
你使用的“suppose”术语表明你不确定吗?如果你提供一些更多的细节和参考资料来说明你如何知道你的消息不会被分块,这可能对其他人有所帮助。描述你的环境也可能是相关的(例如,这是在普通互联网上传输还是在受控环境中进行,你的客户端/服务器仅支持特定的操作系统集)。 - Scott Mitchell
我明白现在我无法测试系统的所有可能配置,需要记住可能出现的问题。这就是为什么我说“假设”,以免断言它的绝对性,因为我可能不知道一些陷阱。我查看了Wireshark(用于精确监视网络的程序)列表,以检查是否有TCP数据包发送到我的服务器端口。服务器和客户端通过外部网络连接。因此,Wireshark显示大数据包(1.4 kB)作为整体传输。适用于Windows Seven x64和Android 3+系统;我开始尝试在服务器/通道初始化器的不同部分中使用参数进行实验。 - Asprelis
我并不建议测试所有可能的配置。只需了解您所操作的环境即可。然后,您可以测试具有有意义差异的最小配置量。我不知道您的整个架构(或环境),但只要您理解我所描述的一般问题,那么您应该有足够的信息来做出明智的决策。 - Scott Mitchell

0

Scott是正确的。仅增加缓冲区的大小并不能解决问题。

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

对于HTTP请求,还应该使用HTTPObjectAggregator。这对我很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接