netty udp蛋疼的事情

2012-11-29

蛋痛的 netty UDP receiveBufferSize

 

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秒方法结束后才发出去。
当然咯,这样也强制你在接收到包以后以新的线程来处理数据,但是至少在文档里也说清楚嘛。

猜你喜欢

转载自skywhsq1987.iteye.com/blog/2098412