NioEventLoop
我们继续NioEventLoop
的构造函数,这里就是对原生的selectedKeys
做了优化。
openSelector
先获取原生的Selector
:
如果禁止优化就直接包装原生的返回:
SelectorTuple
这个元组里面就是一个是原生的,一个是包装后的。
反射出sun.nio.ch.SelectorImpl
:
创建优化的SelectedSelectionKeySet
:
SelectedSelectionKeySet
里面就是用数组来存SelectionKey
,不够就扩容:
直接内存操作,将原生的Selector
的selectedKeys
和publicSelectedKeys
替换成selectedKeySet
:
看原生的这两个属性已经改了:
最后将原生的Selector
封装成SelectedSelectionKeySetSelector
,然后包装到元组返回:
SelectedSelectionKeySetSelector
其实就是代理了原生的Selector
:
一个是原生的一个是封装后的:
这个SelectedSelectionKeySet
是共享的:
NioEventLoopGroup
基本就这些了,其他的我在另外文章讲过就不多说了,我们来看看ServerBootstrap
吧。
ServerBootstrap创建
选项和属性是两个并发安全的hashmap
,然后创建一个ServerBootstrapConfig
配置。
NioServerSocketChannel创建
获取原生ServerSocketChannelImpl对象
ServerBootstrap
的bind
里,会用反射创建NioServerSocketChannel
。
默认的选择器提供器:
就是获取一个NIO
原生的ServerSocketChannel
的实现类sun.nio.ch.ServerSocketChannelImpl
对象,毕竟netty只是做了封装,底层的操作还是原生的来做。
传入监听事件OP_ACCEPT
这里NioServerSocketChannel
默认监听的事件就是OP_ACCEPT
:
在原生的通道上设置监听事件OP_ACCEPT
就是在原生的上面设置:
创建配置NioServerSocketChannelConfig
先获取javaChannel
:
就是我们刚才获取的原生通道:
然后到这里:
DefaultChannelConfig属性初始化ByteBufAllocator
这里就是字节分配器创建的地方,我们来看看他会是什么。
然后是这里。
ByteBufUtil的初始化
分配器是这个:
不是安卓的就是用池化的分配器:
所以我们知道我们用的是池化的分配器。
会到这里,会创建一个AdaptiveRecvByteBufAllocator
,可调节的接收缓冲区,后面会详细讲。
与写相关的属性
这里自旋发送的次数,就是最多发送16
次,将缓冲区的数据发出去,然后自动读就是每当读事件处理完了,还会继续监听读事件,还有写水位设置,就是写缓冲区超过64K
的时候就不可写了,要小于32K
才可写,会触发通道的写能力改变事件channelWritabilityChanged
。
写的可能比较碎,因为有些东西已经讲过,重复讲没必要,讲一些前面没关注的东西。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。