netty 的 NioDatagramWorker
中分配了接收包缓存的最大大小,默认是 768Bytes,蛋痛的是第一次接收 768B后第二次缓存被扩展到 768B*2 buffer 中前768B是第一个包的前面部分数据,后768B是第二个包的前部分数据。
比较奇怪的是:
http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/socket/DatagramChannelConfig.html
里面说了个 receiveBufferSize
,但是设置后无效,经过多次尝试后发现必须要设置 receiveBufferSizePredictor
或者 receiveBufferSizePredictorFactory
才能够改变这个接收包缓存的大小。
如:
bootstrap.setOption("receiveBufferSize", 1048576); bootstrap.setOption("receiveBufferSizePredictor", new FixedReceiveBufferSizePredictor(1048576)); // bootstrap.setOption("receiveBufferSizePredictorFactory", new FixedReceiveBufferSizePredictorFactory(1048576));
吐槽 netty 另外一个蛋痛的地方。在接收到包回写返回包时没有强制发送的方法,必须要等整个
messageReceived
方法返回以后才会把包写出去。如:public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { ... e.getChannel().write(responsePacket); // not send out now Thread.sleep(30000L); ... }上面这块代码中
responsePacket
不是在回写的时候马上发出去的,而是要等 30秒方法结束后才发出去。当然咯,这样也强制你在接收到包以后以新的线程来处理数据,但是至少在文档里也说清楚嘛。
//EOF
0 comments:
Post a Comment