我需要通过TCP / IP从其他IP(导航设备)接收完整数据包。 例如,设备必须定期发送966个字节(超过一分钟)。 在我的情况下,第一个接收缓冲区长度为256字节(第一个数据包),第二个是710字节(最后一个数据包),第三个是完整数据包(966字节)。 如何手动设置第一个接收缓冲区长度的最小值?
这是我的代码:
Executor bossExecutors = Executors.newCachedThreadPool();
Executor workerExecutors = Executors.newCachedThreadPool();
NioServerSocketChannelFactory channelsFactory =
new NioServerSocketChannelFactory(bossExecutors, workerExecutors);
ServerBootstrap bootstrap = new ServerBootstrap(channelsFactory);
ChannelPipelineFactory pipelineFactory = new NettyServerPipelineFactory(this.HWController);
bootstrap.setPipelineFactory(pipelineFactory);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.setOption("child.receiveBufferSizePredictorFactory",
new FixedReceiveBufferSizePredictorFactory(2048)
);
bootstrap.bind(new InetSocketAddress(this.port));
答案 0 :(得分:1)
无论您指定的receiveBufferSizePredictorFactory
是什么,您都会看到邮件被拆分为多个MessageEvent
。这是因为TCP / IP不是面向消息的协议,而是面向流的协议。请阅读the user guide,其中介绍了如何编写适当的解码器来解决此常见问题。