为啥 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