TCP / IPにすでに実装されているサーバーがありますが、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;
}
}
問題は、各データグラムがこのパイプラインの同じインスタンスを使用していることです(各データグラムがパイプラインの新しいインスタンスを使用することを望んでいます)。したがって、データグラムのコンテンツの処理中に保存するすべての状態が保存され、次のデータグラムはそれも同様です(TCPの場合、各接続には独自のチャネルがあり、したがってパイプラインの独自のインスタンスと独自の状態があります)
これがドキュメントを読んだときに予想される動作であることは知っていますが、nettyに各データグラムのパイプラインを再作成させる方法はありますか?それとも私はこれを完全に間違った方法で行っていますか?
簡潔に言えば、各データグラムにパイプラインの新しいインスタンス(tcpと同じ)を持たせたいです。