一。开始
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继承关系图
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()方法