一、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异步队列里的任务