2023-09-13
原文作者:https://blog.csdn.net/wangwei19871103/category_9681495_2.html 原文地址: https://blog.csdn.net/wangwei19871103/article/details/104755480

NioEventLoop

我们继续NioEventLoop的构造函数,这里就是对原生的selectedKeys做了优化。

202309132211387901.png

openSelector

先获取原生的Selector

202309132211445512.png
如果禁止优化就直接包装原生的返回:

202309132211451803.png

SelectorTuple

这个元组里面就是一个是原生的,一个是包装后的。

202309132211459904.png
反射出sun.nio.ch.SelectorImpl

202309132211467455.png
创建优化的SelectedSelectionKeySet

202309132211477246.png

SelectedSelectionKeySet

里面就是用数组来存SelectionKey,不够就扩容:

202309132211485557.png
直接内存操作,将原生的SelectorselectedKeyspublicSelectedKeys替换成selectedKeySet

202309132211492908.png
看原生的这两个属性已经改了:

202309132211504389.png
最后将原生的Selector封装成SelectedSelectionKeySetSelector,然后包装到元组返回:

2023091322115159110.png

SelectedSelectionKeySetSelector

其实就是代理了原生的Selector

2023091322115240011.png
一个是原生的一个是封装后的:

2023091322115334012.png
这个SelectedSelectionKeySet是共享的:

2023091322115452913.png
NioEventLoopGroup基本就这些了,其他的我在另外文章讲过就不多说了,我们来看看ServerBootstrap吧。

ServerBootstrap创建

选项和属性是两个并发安全的hashmap,然后创建一个ServerBootstrapConfig配置。

2023091322115616114.png

NioServerSocketChannel创建

获取原生ServerSocketChannelImpl对象

ServerBootstrapbind里,会用反射创建NioServerSocketChannel

2023091322115705615.png
默认的选择器提供器:

2023091322115789116.png
就是获取一个NIO原生的ServerSocketChannel的实现类sun.nio.ch.ServerSocketChannelImpl对象,毕竟netty只是做了封装,底层的操作还是原生的来做。

2023091322115865617.png

2023091322120021018.png

传入监听事件OP_ACCEPT

这里NioServerSocketChannel默认监听的事件就是OP_ACCEPT

2023091322120111819.png

在原生的通道上设置监听事件OP_ACCEPT

就是在原生的上面设置:

2023091322120191720.png

创建配置NioServerSocketChannelConfig

2023091322120300321.png
先获取javaChannel

2023091322120536022.png
就是我们刚才获取的原生通道:

2023091322120627723.png
然后到这里:

2023091322120704824.png

DefaultChannelConfig属性初始化ByteBufAllocator

这里就是字节分配器创建的地方,我们来看看他会是什么。

2023091322120862225.png
然后是这里。

2023091322121017826.png

ByteBufUtil的初始化

分配器是这个:

2023091322121112627.png
不是安卓的就是用池化的分配器:

2023091322121256728.png

2023091322121390329.png
所以我们知道我们用的是池化的分配器。

会到这里,会创建一个AdaptiveRecvByteBufAllocator,可调节的接收缓冲区,后面会详细讲。

2023091322121466130.png

与写相关的属性

这里自旋发送的次数,就是最多发送16次,将缓冲区的数据发出去,然后自动读就是每当读事件处理完了,还会继续监听读事件,还有写水位设置,就是写缓冲区超过64K的时候就不可写了,要小于32K才可写,会触发通道的写能力改变事件channelWritabilityChanged

2023091322121538731.png
写的可能比较碎,因为有些东西已经讲过,重复讲没必要,讲一些前面没关注的东西。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

阅读全文