Netty框架之Netty组件及其作用

Netty框架之Netty组件及其作用

    • 1.ServerBootStrap
    • 2.group(new NioEventLoopGroup())
    • 3.channel()
    • 4.ChildHandler和Handler
    • 5.ChannelPipeline

说到Netty组件的作用,不得不从Netty的客户端或服务端创建流程分析,请看下面服务端的代码

public static void main(String[] args) {
                //serverBootstrap,就是服务端启动器,启动服务端,并且绑定组件
                ServerBootstrap serverBootstrap = new ServerBootstrap();


                serverBootstrap
                //设置NIOEventLoopGroup包含一组NIOEventLoop,NIOEventLoop其实就是一个单线程(维护Selector,处理channel的请求)
                //这里我们设置两个NIOEventLoopGroup,一个充当Boss专门处理连接请求,一个充当Woker专门处理IO读写请求
                .group(new NioEventLoopGroup(),new NioEventLoopGroup())
                //设置通道类型服务端就是NioServerSocketChannel,客户端是NioSocketChannel
                .channel(NioServerSocketChannel.class)
                //这里设置的就是Woker(child)的处理器,也就是IO读写的具体实现
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    //初始化处理器,处理器用于IO处理的具体实现,把多个处理器加入到pipeline中形成一条处理器连,线程会一次执行这些处理器来完成指定的IO操作
                    @Override
                    protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
                        ChannelPipeline pipeline = nioSocketChannel.pipeline();
                        pipeline.addLast(new StringDecoder());//解析器,收到Bytebuffer数据解析成字符串
                        pipeline.addLast(new ChannelInboundHandlerAdapter() {//自定义处理器

                            //当收到数据的时候会触发这个方法
                            @Override
                            public void channelRead(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {
                                System.out.println(msg);//输出收到的数据
                            }
                        });
                    }
                })
                .bind(8080);//绑定服务器的监听端口
    }

1.ServerBootStrap

服务端启动器,用于启动服务端程序,并且绑定服务端需要的各个Netty组件,包括(NioEventLoopGroup,Channel,Handler等等)

2.group(new NioEventLoopGroup())

用于绑定创建NioEventLoopGroup(),这个NioEventLoopGroup()事件循环组可以包含了一组NioEventLoop,NioEventLoop是一个事件轮询其,本质是一个单线程维护了一个Selector,当有Channel建立的时候会调用register注册到其中一个NioEventLoop中,那么该Channel的所有IO事件都交由此NioEventLoop来处理

3.channel()

指定通道的类型,服务端通道对应NioServerSocketChannel,客户端对应ServerSocketChannel

4.ChildHandler和Handler

boss线程组用于处理连接请求,woker线程组用于处理IO读写请求,Handler对应的就是boss线程组的处理器,ChildHandler对应的就是woker的处理器,如何处理IO读写的具体实现,需要自己根据需求实现细节,如下代码所示

//这里设置的就是Woker(child)的处理器,也就是IO读写的具体实现
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    //初始化处理器,处理器用于IO处理的具体实现,把多个处理器加入到pipeline中形成一条处理器连,线程会一次执行这些处理器来完成指定的IO操作
                    @Override
                    protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
                        ChannelPipeline pipeline = nioSocketChannel.pipeline();
                        pipeline.addLast(new StringDecoder());//解析器,收到Bytebuffer数据解析成字符串
                        pipeline.addLast(new ChannelInboundHandlerAdapter() {//自定义处理器

                            //当收到数据的时候会触发这个方法
                            @Override
                            public void channelRead(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {
                                System.out.println(msg);//输出收到的数据
                            }
                        });
                    }
                })

5.ChannelPipeline

用于形成处理器连,处理IO请求的处理器可能不止一个,例如我需要将收到Byte类型的数据转码为String类型,那么我需要一个解码器,解码之后我需要输出这个String数据,那么需要自定义一个处理器,那么这些处理器都需要一个一个执行,那么此时我们可以把这些处理器加到ChannelPipeline中,他回帮我们按照这个ChannelPipeline中处理器的顺序全部执行一次,完成对数据的整个处理,形象的理解为给你一些食材,你需要很多到工序去把它做成美食,这就是ChannelPipeline的作用

你可能感兴趣的:(Netty,java,Netty,网络编程)