1

现在我正在实现 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的数据报。

但是,我使用 java.net.* 库,如 DatagramSocket.class 和 DatagramPacket.class,它正确接收 sflow 数据报(大约 1300 字节)。

有人可以帮助我吗?因此,我无法正确解析 sflow 数据报。

谢谢。

4

2 回答 2

0

我有同样的问题,尝试使用 Oio 而不是 Nio!(只需将“nio”更改为“oio”,将“Nio”更改为“Oio”。

http://lists.jboss.org/pipermail/netty-users/2009-June/000891.html

现在它正在工作;)

于 2013-01-15T11:55:20.770 回答
0

我还没有测试过,但试一试,可能对你有用。

org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory bufferSizePredictor = new FixedReceiveBufferSizePredictorFactory(1300);// or whatever size you require.
serverBootstrap.setOption("receiveBufferSizePredictorFactory",
            bufferSizePredictor);

一旦你设置了这个预测器工厂,它可能会有所帮助。

于 2012-12-14T04:25:45.010 回答