我们有一个已经实现了TCP/IP协议的服务器,但现在我们需要支持UDP协议的要求。
每个发送的UDP数据报都包含我需要解码的所有内容,因此它是一个非常简单的请求和响应系统,数据在数据报中通过换行符分隔。
服务器启动时引导程序的代码如下所示:
我遇到的问题是每个数据报都使用相同的管道实例(我希望每个数据报都使用新的管道实例),因此在处理数据报内容时存储的所有状态都会被保存,下一个数据报也会使用它(而对于TCP每个连接都有自己的通道,因此有自己的管道实例和状态)。
我知道这是从文档中阅读到的预期行为,但是否有办法强制Netty为每个数据报重新创建管道?还是我完全错了?
简而言之,我希望每个数据报都有一个新的管道实例(与TCP相同)。
每个发送的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相同)。