五Netty源码分析--2ServerBootstrap分析

五Netty源码分析--2ServerBootstrap分析

第二节 ServerBootstrap分析

使用NIO原生类库开发异步服务器时,需要使用多路复用器selector、serverSocketChannel、SocketChannel、selectionKey等,相比于传统BIO开发,NIO开发比较复杂,且稳定性等是个问题。

因此,Netty向使用者屏蔽NIO通信细节,封装了底层细节交给客户,尽量不让用户跟底层API打交道,减少客户的开发量和开发难度,专注于逻辑业务。

(bootsrap使用builder设计模式,因为需要设置的参数太多)

image-20221004223542285

AbstarctBootstrap是netty的配置类和启动辅助类,由于NIO网络编程涉及的参数较多,使用bootstrap可以快捷的启动。

server端和client端的启动代码如下:

//server端

				//netty的线程模型,分别用来处理连接请求、IO读写请求的线程组
				EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
          //创建server端启动辅助类
            ServerBootstrap b = new ServerBootstrap();
/** …………………………………………………………………………………………server端parentchannel的配置信息…………………………………………………………………………………………………………*/
          //参数option设置
            b.option(ChannelOption.SO_BACKLOG, 1024);
          //配置线程组模型
            b.group(bossGroup, workerGroup)
              		//指定IO的通道模型类(是server端还是client端)
                    .channel(NioServerSocketChannel.class)
              //添加server端的业务逻辑
                    .handler(new LoggingHandler(LogLevel.INFO))
/** …………………………………………………………………………………………server端childchannel的配置信息…………………………………………………………………………………………………………*/
              //添加通过accept接入的client端socketChannel,消息的业务处理逻辑
                    .childHandler(new ServerInitializer());
						//server端bind绑定
            Channel ch = b.bind(Config.getInt("server.port")).sync().channel();

            ch.closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
          //优雅关闭资源
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }

ServerBootstrap与Bootstrap分别是server端和client端启动配置类。用于绑定netty的线程模型(nioEventLoopGroup)、指定channel类型、channel的option参数、绑定channel的处理器等操作。

注意:

ServerBootstarp启动类的配置选项,分别配置server端父channel和子channel;在Bootstrap中,配置的就是client端的channel。

Bootstrap.bind(UDP)/connect(TCP),创建client端channel,是一个单独且无parentchannel的对象,实现所有的网络交换;

ServerBootstarp.bind,创建的channel作为parentchannel,其管理多个server端的子channel(server端parentchannel.accept创建的就是childchannel),子channel是用于同client端进行通信的对象。

posted @ 2023-03-10 17:25  LeasonXue  阅读(24)  评论(0编辑  收藏  举报