ServerBootstrap

155 阅读3分钟

ServerBootstrap

类的签名

继承AbstractBootstrap

  • extends AbstractBootstrap<ServerBootstrap, ServerChannel>

构造函数

public ServerBootstrap() { }

group函数

用于接收EventLoopGroup

入参

  • EventLoopGroup parentGroup, EventLoopGroup childGroup

parentGroup属于父类

  • super.group(parentGroup);

    • volatile EventLoopGroup group;
      

childGroup属于ServerBootstrap

  • private volatile EventLoopGroup childGroup;
    

channel函数

public B channel(Class<? extends C> channelClass) {

    return channelFactory(new ReflectiveChannelFactory<C>(
            ObjectUtil.checkNotNull(channelClass, "channelClass")
    ));
}

这个函数属于父类AbstractBootstrap

  • private volatile ChannelFactory<? extends C> channelFactory;
    
  • 用具体的channel的class new了一个ReflectiveChannelFactory出来然后赋值给父类AbstractBootstrap的channelFactory字段

用于给channelFactory字段赋值

ChannelFactory接口

类签名

  • public interface ChannelFactory extends io.netty.bootstrap.ChannelFactory

io.netty.bootstrap.ChannelFactory这个已经过期,所以不在去看

只有一个方法

  • @Override
    
    T newChannel();

总结:

  • Channel工厂是一个工厂,用来生产channel

ReflectiveChannelFactory类

类签名

  • public class ReflectiveChannelFactory implements ChannelFactory

字段

  • private final Constructor<? extends T> constructor;

构造函数

  • 方法签名

    • public ReflectiveChannelFactory(Class<? extends T> clazz)
  • 函数体

    • this.constructor = clazz.getConstructor();
    • 将class的无参构造函数提取出来

newChannel方法实现

  • return constructor.newInstance();

总结

  • 它是一个用反射生产特定channel的channel工厂
  • 它会将某中特定channel的构造函数存起来

option函数

这个函数属于父类AbstractBootstrap

函数签名:

  • public B option(ChannelOption option, T value)

函数体

  • 将option和value赋值到options map中
  • 如果value=null,则表示要将options map中相对应的entry删掉

private final Map<ChannelOption, Object> options = new LinkedHashMap, Object>();

  • 这个options的是用的LinkedHashMap,是由于需要记录options的插入顺序

总结

  • 用于对options 进行插入或者删除
  • options这个map保存的是对socket的选项的设置

ChannelOption类

常量接口Constant

  • public interface Constant<T extends Constant> extends Comparable
  • int id();
  • String name();

抽象常量AbstractConstant

  • 常量接口的一个基础实现

  • 字段

    • private final int id;
    • private final String name;
    • private final long uniquifier;
    • private static final AtomicLong uniqueIdGenerator = new AtomicLong();
  • uniquifier通过uniqueIdGenerator生产,其他的字段是入参传进来的

ChannelOption继承自AbstractConstant

有一个static的字段pool,类型是ConstantPool,从字面意思看,这个是一个用于存放ChannelOption常量的常量池

  • 常量池ConstantPool的常量放在一个map中

    • ConcurrentMap<String, T> constants
    • key为常量的name,value为常量

有很多的static的ChannelOption的示例

  • 比如ChannelOption SO_BACKLOG = valueOf("SO_BACKLOG");
  • 然后这些示例都会通过valueOf方法存入常量池中

总结

  • netty将socket的选项,也进行了封装

childOption函数

有一个map,Map<ChannelOption, Object> childOptions = new LinkedHashMap, Object>();

用于对这个map的entry进行添加后者删除,如果value为null则删除

总结

  • 对于从监听socket accept出来的socket的进行socket选项的设置

localAddress

这个方法是父类中的方法

public B localAddress(SocketAddress localAddress)

用于对socket的本地地址进行赋值

  • private volatile SocketAddress localAddress;
    

childHandler

方法签名

  • public ServerBootstrap childHandler(ChannelHandler childHandler)

用于对 private volatile ChannelHandler childHandler;赋值

bind

方法签名

  • public ChannelFuture bind()

这个方法是父类中的

函数体

  • 校验

    • group字段必须有
    • channelFactory字段必须有
    • localAddress 必须有
  • 做地址和端口的绑定

    • 创建channel并且注册,返回的是一个ChannelFuture

      • final ChannelFuture regFuture = initAndRegister();
    • 从ChannelFuture中拿出channel

      • final Channel channel = regFuture.channel();
    • 如果ChannelFuture的cause不为null,则直接返回这个ChannelTuture

      • if (regFuture.cause() != null) { return regFuture; }
    • 如果ChannelFuture已经完成regFuture.isDone()

      • 则从这个channel中new一个promise出来

        • ChannelPromise promise = channel.newPromise();
      • 实行绑定

        • doBind0(regFuture, channel, localAddress, promise);
      • 直接返回这个promise

        • return promise;
    • 否则,这一步只是以防万一,正常来说上一步isDone是会返回true

      • 用channelnew一个PendingRegistrationPromise出来

        • final PendingRegistrationPromise promise = new PendingRegistrationPromise(channel);
      • 对ChannelFuture加入一个监听器,ChannelFuture如果完成了这个监听器会被会回调

        • 监听器的回调函数签名

          • public void operationComplete(ChannelFuture future) throws Exception
        • 回调函数内容

          • 从future中拿出cause

            • Throwable cause = future.cause();
          • 如果cause不为null

            • 则promise这个PendingRegistrationPromise设置为失败

              • promise.setFailure(cause);
          • 否则

            • 对PendingRegistrationPromise这个promise调用registered方法

            • 实行绑定

              • doBind0(regFuture, channel, localAddress, promise);
      • 返回promise这个PendingRegistrationPromise

AbstractBootstrap的initAndRegister

这个方法是包可见性

用channelFactory生产出一个Channel出来

  • channel = channelFactory.newChannel();

初始化这个channel

  •        init(channel);
    

以上如果抛出异常则

  • 如果channel不为null

    • 强制关闭channel

      • channel.unsafe().closeForcibly();
    • return new DefaultChannelPromise(channel, GlobalEventExecutor.INSTANCE).setFailure(t);

  • 否则返回

    • return new DefaultChannelPromise(new FailedChannel(), GlobalEventExecutor.INSTANCE).setFailure(t);

否则

  • 将生产出来的channel注册到group中

    • ChannelFuture regFuture = config().group().register(channel);
  • 如果注册失败则关闭channel

    • if (regFuture.cause() != null) { if (channel.isRegistered()) { channel.close(); } else { channel.unsafe().closeForcibly(); } }
  • 返回regFuture这个ChannelFuture