【知识积累】深入Netty源码理解Netty对NIO模型的封装

一、Selector selector = Selector.open();

二、指定通道实现(通过反射的方式)

三、ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

初始化和注册,并把ServerChannel绑定到网络端口上

初始化NioServerSocketChannel(对ServerSokcetChannel的包装)

四、serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

初始化channel,并将channel感兴趣的事件设置为OP_ACCEPT

配置channel非阻塞

初始化ServerChannel的pipeline(链表)

当channel注册时会调用initChannel方法

五、selector.select();

从bossGroup里拿一个线程来处理channel的注册,将其注册到线程自己的selector上

 

注册channel到selector

调用pipeline里的每个handlerd的handlerAdded方法(channel注册时调用,调用完会删除该handler)

调用pipeline里的每个handler的channelRegistered方法

六、Set<SelectionKey> selectionKeys = selector.selectedKeys();

把task线程放入TaskQueue异步执行

死循环执行监听IO事件

当timeoutMillis超时或者有事件发生会break处理

for循环处理selectorKey中所有的key

七、服务端接收连接事件

readBuf里放的是OP_ACCEPT事件连接过来的所有SocketChannel

把SokcetChannel包装为NioSocketChannel

将Channel感兴趣的事件设置为OP_READ

SocketChannel配置为非阻塞

初始化SocketChannel的pipeline

从head开始调用ServerChannel的pipeline里所有的InboundHandler

childHandler就是netty服务端初始代码我们自己写的ChannelInitializer

把连接过来的socketChannel注册到workerGroup里的一个线程的selector上,SocketChannel注册逻辑和ServerSocketChannel注册逻辑一样,注册完全会调用SocketChannel里的ChannelInitializer把里面我们自己写的Handler全部放入pipeline

八、读事件(零拷贝)

九、runAllTasks

运行TaskQueue异步队列里的任务

Je suppose que tu aimes

Origine blog.csdn.net/axin1240101543/article/details/117285182
conseillé
Classement