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这个已经过期,所以不在去看
只有一个方法
-
T newChannel();@Override
总结:
- 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