现在我正在实现UDP服务器以使用netty库收集sflow数据报。
这是我对udp服务器的设置。
ChannelFactory factory = new NioDatagramChannelFactory(this.threadPool.getScheduledExecutor());
ConnectionlessBootstrap bootstrap = new ConnectionlessBootstrap(factory);
bootstrap.setPipelineFactory(new ChannelPipelineFactory(){
public ChannelPipeline getPipeline(){
ChannelPipeline lChannelPipeline = Channels.pipeline();
lChannelPipeline.addLast("sflowmessagedecoder", new SflowMessageDecoder());
lChannelPipeline.addLast("handler", new SflowCollectorHandler());
return lChannelPipeline;
}
});
bootstrap.setOption("receiveBufferSize", 65536);
bootstrap.bind(new InetSocketAddress(port));
问题在于,当我收到一个sflow数据报(大约1300字节长,可以使用wireshark检查)时,netty只读取大约700个字节,这可以通过channelbuffer的大小来检查来自channelbuffer的数据报。 / p>
但是,我使用java.net。*库,如DatagramSocket.class和DatagramPacket.class,它正确接收sflow数据报(大约1300字节)。
有人可以帮助我吗?因此,我无法正确解析sflow数据报。
感谢。
答案 0 :(得分:0)
我没有对此进行测试,但试一试,可以为你效劳。
org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory bufferSizePredictor = new FixedReceiveBufferSizePredictorFactory(1300);// or whatever size you require.
serverBootstrap.setOption("receiveBufferSizePredictorFactory",
bufferSizePredictor);
设置此预测变量工厂后,可能帮助。
答案 1 :(得分:0)
我有同样的问题,尝试使用Oio而不是Nio! (只需将“nio”改为“oio”,将“Nio”改为“Oio”。
http://lists.jboss.org/pipermail/netty-users/2009-June/000891.html
现在它正在运作;)