2012-04-26 69 views
2

我們已經有了一個已經在TCP/IP中實現的服務器,但是現在我們也需要支持UDP的協議。Netty根據UDP數據報的不同流水線

發送的每個UDP數據報都包含我需要解碼的所有內容,因此它是一個非常簡單的答覆和響應系統,數據報中的數據由換行符分隔。

用於當所述服務器啓動如下所示的自舉代碼:

//SETUP UDP SERVER 
    DatagramChannelFactory udpFactory = new NioDatagramChannelFactory(Executors.newCachedThreadPool()); 

    ConnectionlessBootstrap udpBootstrap = new ConnectionlessBootstrap(udpFactory); 

    udpBootstrap.setOption("sendBufferSize", 65536); 
    udpBootstrap.setOption("receiveBufferSize", 65536); 
    udpBootstrap.setOption("receiveBufferSizePredictorFactory", new AdaptiveReceiveBufferSizePredictorFactory()); 

    udpBootstrap.setOption("broadcast", "true"); 
    udpBootstrap.setPipelineFactory(new ServerPipeLineFactoryUDP()); 
    udpBootstrap.bind(new InetSocketAddress(hostIp, 4000)); 

流水線的代碼是:

class ServerPipeLineFactoryUDP implements ChannelPipelineFactory 
{ 

    private final static ExecutionHandler EXECUTION_HANDLER = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(ScorpionFMS.THREAD_POOL_COUNT, 0, 0)); 

    public ServerPipeLineFactoryUDP() 
    { 

    } 

    @Override 
    public ChannelPipeline getPipeline() throws Exception 
    { 

    ChannelPipeline pipeline = pipeline(); 
    pipeline.addLast("debugup", new DebugUpstreamHandler("UDP")); 
    pipeline.addLast("debugdown", new DebugDownstreamHandler("UDP")); 

    pipeline.addLast("framer", new DelimiterBasedFrameDecoder(256, Delimiters.lineDelimiter())); 

    pipeline.addLast("decoder", new UDPRequestDecoder(true)); 
    pipeline.addLast("encoder", new StringEncoder()); 
    pipeline.addLast("executor", EXECUTION_HANDLER); 
    pipeline.addLast("handler", new UDPRequestHandler(

    return pipeline; 
    } 
} 

問題IM具有是每個數據報被使用的相同的實例這個流水線(我希望每個數據報將使用一個新的流水線實例),所以我在處理數據報內容時所存儲的所有狀態都會被保存下來,並且下一個數據報也會使用它(而對於TCP,每個連接都會有它的自己的渠道,因此它自己的我管道的狀態和它自己的狀態)

我知道這是從閱讀文檔中的預期行爲,但無論如何強迫網絡重新創建每個數據報的管道?或者我是否完全錯誤的方式?

說得簡潔,我想每個數據報有管道(同TCP)

+0

爲什麼*在你的處理程序中存儲狀態*你需要一種連接的概念來傳達你的信息嗎?首先,你似乎不需要它,但後來你似乎改變了主意(如果你不需要它,爲什麼要存儲它)。 。 。 – MartinK 2012-04-27 11:30:59

回答

5

就像我在IRC中所說的,我認爲這可以做你想做的或者至少給你一些想法。

public class Example { 

    public static void main(String[] args) { 
     final ChannelPipelineHandlerImpl perDatagramFactory = new ChannelPipelineHandlerImpl(); 

     DatagramChannelFactory udpFactory = new NioDatagramChannelFactory(Executors.newCachedThreadPool()); 

     ConnectionlessBootstrap udpBootstrap = new ConnectionlessBootstrap(udpFactory); 

     udpBootstrap.setPipelineFactory(new ChannelPipelineFactory() { 

      public ChannelPipeline getPipeline() throws Exception { 
       return Channels.pipeline(new DistinctChannelPipelineHandler(perDatagramFactory)); 
      } 
     }); 

    } 

    private static final class DistinctChannelPipelineHandler implements ChannelDownstreamHandler, ChannelUpstreamHandler { 
     private ChannelPipelineFactory factory; 

     public DistinctChannelPipelineHandler(ChannelPipelineFactory factory) { 
      this.factory = factory; 
     } 

     public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception { 
      ChannelPipeline pipeline = factory.getPipeline(); 
      pipeline.attach(ctx.getChannel(), ctx.getPipeline().getSink()); 
      pipeline.sendUpstream(e); 

      ctx.sendUpstream(e); 

     } 

     public void handleDownstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception { 
      ChannelPipeline pipeline = factory.getPipeline(); 
      pipeline.attach(ctx.getChannel(), ctx.getPipeline().getSink()); 
      pipeline.sendDownstream(e); 

      ctx.sendDownstream(e); 
     } 

    } 

    private static final class ChannelPipelineHandlerImpl implements ChannelPipelineFactory { 

     public ChannelPipeline getPipeline() throws Exception { 
      // Add your handlers here 
      return Channels.pipeline(); 
     } 

    } 
} 
+0

隨着一些變化,它正是我所需要的。再次感謝!現在有了完美的TCP/IP和UDP運行。 – 2012-04-27 14:37:54

+0

很酷..感謝您的反饋! – 2012-04-27 16:14:59

+2

@NormanMaurer在Netty 4中是否有類似的例子?發現它非常有幫助! – Abe 2013-04-04 20:24:47

0

的新實例,我不知道對UDP通道是如何被處理,但如果渠道是不同的每個數據報,您可以將您的狀態存儲在ChannelLocal s中。

+0

不幸的是,問題是每個數據報的通道並不明顯,這就是我想要實現的。 – 2012-04-27 08:37:00