init初始化方法
1.设置channel选项,调用channelOptions
2.设置channel的属性attr
3.然后从channel中获取pipeline,然后给pipeline增加config中获取的handler
1.增加对应的childHandler
2.设置channel选项options
3.设置属性,调用setAttributes
4.增加监听器,监听完成方法,如果失败了,就直接forceClose,强制关闭channel
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.3 group
#group(EventLoopGroup group)
方法,设置 EventLoopGroup 到 group
3.4 channel
#channel(Class<? extends C> channelClass)
方法,设置要被实例化的 Channel 的类
3.4.1 ChannelFactory
io.netty.channel.ChannelFactory
,Channel 工厂接口,用于创建 Channel 对象
3.4.2 ReflectiveChannelFactory
io.netty.channel.ReflectiveChannelFactory
,实现 ChannelFactory 接口,反射调用默认构造方法,创建 Channel 对象的工厂实现类。
3.5 localAddress
#localAddress(...)
方法,设置创建 Channel 的本地地址
3.6 option
#option(ChannelOption<T> option, T value)
方法,设置创建 Channel 的可选项
3.7 attr
#attr(AttributeKey<T> key, T value)
方法,设置创建 Channel 的属性
3.8 handler
#handler(ChannelHandler handler)
方法,设置创建 Channel 的处理器
3.9 validate
#validate()
方法,校验配置是否正确
3.11 config
#config()
方法,返回当前 AbstractBootstrap 的配置对象
3.12 setChannelOptions
#setChannelOptions(...)
静态方法,设置传入的 Channel 的多个可选项
3.13 bind
#bind(...)
方法,绑定端口,启动服务端
1.创建channel对象
2.初始化channel配置
3.注册channel到eventLoopGroup
4.绑定channel的端口,注册channel到SelectionKey
bind方法核心流程
Channel注册到EventLoopGroup,然后绑定channel端口到地址address,把channel注册到SelectionKey
调用 DefaultChannelPipeline#fireChannelActive()
方法,触发 Channel 激活的事件
用 #safeSetSuccess(ChannelPromise)
方法,回调通知 promise
执行成功。此处的通知,对应回调的是我们添加到 #bind(...)
方法返回的 ChannelFuture 的 ChannelFutureListener 的监听器
在最后几行,我们可以看到,调用 SelectionKey#interestOps(ops)
方法,将我们创建 NioServerSocketChannel 时,设置的 readInterestOp = SelectionKey.OP_ACCEPT
添加为感兴趣的事件。也就说,服务端可以开始处理客户端的连接事件
3.14 initAndRegister
#initAndRegister()
方法,初始化并注册一个 Channel 对象,并返回一个 ChannelFuture 对象
首先获得 EventLoopGroup 对象,后调用 EventLoopGroup#register(Channel)
方法,注册 Channel 到 EventLoopGroup 中。实际在方法内部,EventLoopGroup 会分配一个 EventLoop 对象,将 Channel 注册到其上
若发生异常,并且 Channel 已经注册成功,则调用 #close()
方法,正常关闭 Channel
创建 Channel 对象
3.14.3 注册 Channel 到 EventLoopGroup
注册channel到eventLoop成功后,会得到selectionKey
4.8 init
#init(Channel channel)
方法,初始化 Channel 配置