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