为啥 Netty 从 UDP 消息中只给我 768 个字节

Posted

技术标签:

【中文标题】为啥 Netty 从 UDP 消息中只给我 768 个字节【英文标题】:Why is Netty giving me only 768 Bytes from UDP messages为什么 Netty 从 UDP 消息中只给我 768 个字节 【发布时间】:2012-07-17 15:23:18 【问题描述】:

我已将“receiveBufferSize”选项设置为 1024,但由于某种原因,messageReceived 中仍然只有 768 个字节。数据头表示正在发送的数据大小为1004。

下面是服务器的初始化代码:

public static void main(String[] args) throws Exception 
    ConnectionlessBootstrap b = new ConnectionlessBootstrap(new NioDatagramChannelFactory());

    // Options for a new channel        
    b.setOption("receiveBufferSize", 1024);
    System.out.println(b.getOptions());

    b.setPipelineFactory(new ChannelPipelineFactory() 

        @Override
        public ChannelPipeline getPipeline() throws Exception 
            return Channels.pipeline(
                    new MyUDPPacketDecoder(),
                    new StdOutPrintHandler());
        
    );

    b.bind(new InetSocketAddress(myPort));

【问题讨论】:

【参考方案1】:

您需要设置一个额外的选项 - receiveBufferSizePredictorFactory。

为了预测它需要分配多少空间来保存传入的消息,netty 使用一个预测器来预测要分配的字节量。

有两种类型的接收缓冲区大小预测器,自适应和固定大小。 预测器由预测器工厂创建,它为引导程序创建的每个通道创建一个。

如果没有为引导程序设置预测器工厂(或没有为通道手动设置预测器),则通道使用默认的 768 字节固定大小预测器。所有大于 768 字节的消息都会被缩减到该大小。

您可以添加:

b.setOption("receiveBufferSizePredictorFactory", new FixedReceiveBufferSizePredictorFactory(1024));

您可以在 netty 文档中阅读有关预测器及其工厂的信息

ReceiveBufferSizePredictor Inteface

ReceiveBufferSizePredictorFactory Inteface

【讨论】:

您能否为默认预测器添加一个引用,该预测器是 768 字节的固定大小预测器? DatagramChannelFactory。看看 setReceiveBufferSizePredictor(ReceiveBufferSizePredictor) '默认预测器是 FixedReceiveBufferSizePredictor(768)

以上是关于为啥 Netty 从 UDP 消息中只给我 768 个字节的主要内容,如果未能解决你的问题,请参考以下文章

说消息只给我一个短语的第一个单词,JavaScript - Discord.js

为啥 Netty 4 没有 Datagram ServerChannel

netty中使用tcp和udp的区别

4.socket框架netty的使用,以及nio的实现原理,为啥是异步非阻塞

为啥选择Netty作为基础通信框架

为啥选择 Netty 作为基础通信组件