• netty入门例子


    netty封装了java的nio。开发只需要按照netty提供的api方法,相对繁琐nio使开发变的相对简单很多。
    服务端启动

    //创建两个线程池
    EventLoopGroup bossGroup = new NioEventLoopGroup(1);
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    //boot启动类
    ServerBootstrap boot = new ServerBootstrap();
    //绑定线程池,channel类型为NioServerSocketChannel
    boot.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
            .childHandler(new ChannelInitializer() {
                @Override
                protected void initChannel(SocketChannel channel) throws Exception {
                   //添加pipeline
                    channel.pipeline()
                            .addLast(new StringDecoder())
                            .addLast(new StringEncoder())
                            .addLast(new ChatServerHandler());
                }
            });
    System.out.println("server start");
    //绑定端口
    ChannelFuture future = boot.bind(9000).sync();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    ChatServerHandler就是简单继承SimpleChannelInboundHandler,重写channelRead0方法。

    public class ChatServerHandler extends SimpleChannelInboundHandler {
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception {
            System.out.println(s);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    客户端启动

    //创建线程组
    EventLoopGroup group = new NioEventLoopGroup();
    //启动类
    Bootstrap boot = new Bootstrap();
    //绑定线程组,设置channel类型为NioSocketChannel
    boot.group(group).channel(NioSocketChannel.class)
            .handler(new ChannelInitializer() {
                @Override
                protected void initChannel(SocketChannel channel) throws Exception {
                    //初始化pipeline
                    channel.pipeline()
                            .addLast(new StringEncoder())
                            .addLast(new StringDecoder());
                }
            });
            //连接server
    ChannelFuture future = boot.connect("localhost", 9000).sync();
    Channel channel = future.channel();
    //发送数据
    channel.writeAndFlush("hi");
    channel.closeFuture().sync();
    group.shutdownGracefully();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    服务端能收到客户端发送数据。

    线程模型

    使用reactor线程模型处理channel事件。
    在这里插入图片描述

    线程组:

    线程组的创建通过NioEventLoopGroup类,可以入参指定线程组内child数量,不指定会根据当前机器的CPU进行计算child数量。每个child是一个NioEventLoop实例。NioEventLoop是一个单线程线程池类。

    线程组内监听到Selector事件都会交由channel绑定的pipeline进行处理。

    BossGroup:负责创建serverchannel,并且处理client连接事件,也就是accept事件。然后将新建的client连接与workGroup线程池进行绑定

    workGroup:负责监听已绑定channel连接的读写事件。

    参考:

    https://www.alibabacloud.com/blog/essential-technologies-for-java-developers-io-and-netty_597367

  • 相关阅读:
    OpenCV(四十三):Shi-Tomas角点检测
    【Phoenix】phoenix实现每个Primarykey主键保留N版本数据,CDC数据记录为Changelog格式
    hbuiderx基于安卓app运动员体能综合分析训练系统 微信小程序
    【LeetCode每日一题:799.香槟塔~~~模拟】
    关于一维数组的扩容
    闲聊系列之 5-why root cause分析法
    使用Kohya_ss训练Stable Diffusion Lora
    软件测试入门一(认识软件测试)
    平地惊雷,GPT-4o 凌晨震撼发布
    Android MediaCodec 简明教程(九):使用 MediaCodec 解码到纹理,使用 OpenGL ES 进行处理,并编码为 MP4 文件
  • 原文地址:https://blog.csdn.net/sinat_16493273/article/details/132898183