Netty udp如何使用reactor多线程模式
netty udp方式如何起多个线程接收并处理客户端数据啊,channelhandler处理数据时怎么做到多线程。我写了几个测试类,起了10个客户端每隔100ms发一次udp消息,根据测试结果,有下面几个问题:
1、不管多少客户端发消息上来,服务端就只有一个nioeventLoopGroup线程在处理,channelHandler打印的线程名都是一样的,怎么使用主从Reactor线程模型(每个客户端应该有一个nioeventLoop线程去处理)?
2、channelhandler是单例的,不管有多少客户端连上来发消息,始终只有一个channelhandler实例在处理。怎么实现多线程去处理?难道自己在channelRead0方法中起一个线程池?那这样我还用netty干嘛呢
3、ByteBuf 怎么用才可以避免内存泄露问题
代码如下:
public class NettyUdpServer {
public static void main( String[] args ) throws InterruptedException {
Bootstrap bootstrap = new Bootstrap();
EventLoopGroup group = new NioEventLoopGroup(5);// 这线程池初始化了5个,但为什么始终只会起一个?
bootstrap.group( group ).channel( NioDatagramChannel.class ).handler( new UdpHandler() );
bootstrap.bind( 1234 ).sync().channel().closeFuture().await();
}
}
public class UdpHandler extends SimpleChannelInboundHandler<DatagramPacket> {
private int i = 0;
@Override
protected void channelRead0( ChannelHandlerContext ctx, DatagramPacket packet ) throws Exception {
// 读取收到的数据
ByteBuf buffer = packet.copy().content();
byte[] ret = new byte[buffer.readableBytes()];
buffer.readBytes( ret );
String content = new String(ret,CharsetUtil.UTF_8);
System.out.println("收到客户端数据:"+content);
// 每次打印的线程名都一样,i都是在上个客户端基础上自增
byte[] byteToSend = ( Thread.currentThread().getName() + (i++) ).getBytes( "utf-8" );
// 回复一条信息给客户端
ctx.writeAndFlush( new DatagramPacket(Unpooled.copiedBuffer( byteToSend ),packet.sender()) ).sync();
}
}