57. 网状的源代码分析——服务器端启动ServerBootstrap初始化

  

一。开始

  

1.1上一篇

  

接上一篇NioEventLoopGroup的实例化分析继续https://blog.51cto.com/483181/2118817

  

这篇博客要分析的是“2。ServerBootstrap初始化”,如下:

  
 <代码> EventLoopGroup bossGroup=new NioEventLoopGroup ();
  EventLoopGroup workerGroup=new NioEventLoopGroup ();
  尝试{
  ServerBootstrap b=new ServerBootstrap ();//2。ServerBootstrap初始化
  b。集团(bossGroup workerGroup)//2。ServerBootstrap初始化
  .channel (NioServerSocketChannel.class)
  .option (ChannelOption。SO_BACKLOG, 100)
  .handler(新LoggingHandler (LogLevel.INFO))
  .childHandler(新的ChannelInitializer () {
  @Override
  保护无效initChannel (SocketChannel ch){抛出异常
  
  }
  });
  
  ChannelFuture f=b.bind(港口).sync ();//3。绑定
  .sync .closeFuture f.channel () () ();
  }捕捉(异常e) {
  e.printStackTrace ();
  最后}{
  bossGroup.shutdownGracefully ();
  workerGroup.shutdownGracefully ();
  } 
  

二。ServerBootstrap

  

2.1 ServerBootstrap继承关系图

  

 57。网状的源代码分析——服务器端启动ServerBootstrap初始化

  

2.2 ServerBootstrap构造函数

  
 <代码>公共ServerBootstrap () {}
   
  

ServerBootstrap提供了一个无参构造函数,其实有点奇怪,因为像这种网络服务肯定要适应不同的场景,所以肯定得有很多参数的构造函数。
对于这一点,正是因为要适配的参数太多了,所以ServerBootstrap提供了一个无参构造函数,然后使用构造者模式来解决这个问题。
如下:

  
 <代码>公共ServerBootstrap childHandler (ChannelHandler childHandler) {
  如果(childHandler==null) {
  把新NullPointerException (“childHandler”);
  }
  这一点。childHandler=childHandler;
  返回;
  } 
  

2.3 ServerBootstrap.group

  
 <代码>公共ServerBootstrap集团(EventLoopGroup parentGroup, EventLoopGroup childGroup) {
  super.group (parentGroup);
  如果(childGroup==null) {
  把新NullPointerException (“childGroup”);
  }
  如果这一点。childGroup !=null) {
  把新IllegalStateException (“childGroup已经设置”);
  }
  这一点。childGroup=childGroup;
  返回;
  }
  
  父类的组(xx)
  
  公共B组(EventLoopGroup集团){
  这一点。组=组;
  返回self ();
  } 
  

传入了两个EventLoopGroup,也就是上一篇文章说的NioEventLoopGroup,一个是bossGroup,一个workerGroup。
其中bossGroup存在它的父类组属性
workerGroup存在ServerBootstrap的childGroup属性里面,不过暂时不知道它们之间的区别。

  

继续看b.channel (NioServerSocketChannel.class)

  

2.4设置频道

  

代码在ServerBootstrap的父类AbstractBootstrap里面,如下:

  
 <代码>公共B通道(Class<?C>延伸;channelClass) {
  返回channelFactory(新的ReflectiveChannelFactory (channelClass));
  }
  
  公共B channelFactory (ChannelFactory<?C>延伸;channelFactory) {
  这一点。channelFactory=channelFactory;
  返回self ();
  }
  
  公开课ReflectiveChannelFactory{
  
  私人最终Class<?T>延伸;clazz;
  
  公共ReflectiveChannelFactory (Class<?T>延伸;clazz) {
  这一点。clazz=clazz;
  }
  
  @Override
  公共T newChannel () {
  尝试{
  .newInstance返回clazz.getConstructor () ();
  }捕捉(Throwable t) {
  }
  }
  } 
  

上面这段代码可以看出:

  
      <李>初始化了一个ReflectiveChannelFactory工程类,它是一个工厂类,调用newChannel的时候负责初始化一个指定通道。也就是我们传入进来的NioServerSocketChannel对象。   <李>这个工厂对象保存在AbstractBootstrap的channelFactory属性里面,以便于后面调用生成频道对象,目前只是保存工厂对象。   
  

继续看b.option()方法

  

2.5设置选项/h3>   
 <代码> Map选项;
  
  公共& lt; T>B选项(ChannelOption选项,T值){
  如果(选项==null) {
  把新NullPointerException(“选项”);
  }
  如果(value=https://www.yisu.com/zixun/=null) {
  同步(选项){
  options.remove(选项);
  }
  其他}{
  同步(选项){
  选项。(选择,价值);
  }
  }
  返回self ();
  }

57. 网状的源代码分析——服务器端启动ServerBootstrap初始化