Netty udp如何使用reactor多线程模式

luyun2011 2017-03-23 03:29:07
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();
    }
}
...全文
1372 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShingHufman 2017-07-03
  • 打赏
  • 举报
回复
楼主有解决方法了没,我遇到同样的问题,特别是第二个
玲姐mike 2017-05-25
  • 打赏
  • 举报
回复
在handler类定义私有静态变量 private static int i =0,然后再试试,你把i定义到方法体里面了,每个连接进来之后都会对i重新初始化,所以你看到的i的值总是一样的
luyun2011 2017-03-28
  • 打赏
  • 举报
回复
没专家回答啊

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧