本文基于Netty 4.1.49版本,主要分析NioEventLoop 如何处理新连接接入。
NioEventLoop 检测select是否有事件就绪
- NioEventLoop.run 死循环持续检测select是否有事件就绪。
- 调用pro1 8 S X % Q b ncess; . ]SelectedKeys处理就绪事件。
- 调用processSelectedKeysOptimized()方法或者processSelectedKeysPlain()方法处理就绪事件。
NioEventLoop 接受新连接
- 从就绪selectkey 的附件中获取NioServerSocketChannel实例(就是上篇文章中绑定端口的NioServerSocketChannel)。
- 调用processSelectedKey(SelectionKey k, Ab# 6 j H v , n ^ /stractNioK ? , O j a k /Channel ch)方法。
- 判断是否是OP_ACCEPT事件。
- 委托给NioSey l p *rverSocketChannel实例的unsag u k zfe.read()方法。
- 委托给NioServerSocketChannel实例doReadMessag5 F W w v Fes
- 通过NioServerSocketChannel实V J S f f z M例accepe 9 R } 3 jt方法获取一个连接SocketChannel
- 新连接SocketChannel包装成NioSocketChannel socketChanneX 3 e y 8 V ; ^ Dl实例。
新连接N4 L VioSocket7 2 M ) D ? 6 m cChanne0 p + # K i =l绑定NioEventLoop
- 通过NiZ p T e + %oServerSocketChannel实例的pipeliP / c une.fireChannelRead传播 sock3 k S m * d JetChannel新t e w连接
- NioServerSocketCA d ahannel实例的pipl K L o 7 Reline 传播到Sei x b { 3 0rverBootstrapAcceptor处理器,执行channelRead()方法。
- 给新连接socketChannel绑定一个NioEventLoop。
新连接注册select
- 把新连接注册到NioEventLoop的select上。此时不关注任何事件。
注7 7 0 ! c {册SelectionKey.OP_READ事件
- 通过socketCha? z _ 9nnem A n y 2 d Cl.pipeline.fireChannelActive();传播channelActive事件。
- 委托给 新连接soketCha T _nnel.pipeline.head.channelActive方法
- 调用新连接soketChannel.pipeline.headreadIfIsAutoRead()方法
- 委托给新连接socketChann{ . 6 = s : u }el.read();方法
- 委托给 socketChannelp A d B k z.pipeline.read();方法
- 委托给 socketChannel.pipeline.tail.read();方法
- 委托给 socketCh7 i ? D ; s : T -annel.pipeline.head.read();
- 委托给 socketChannel.unsafe.beginRead();
- 委托给 socketChannel.doBeginRK x 9 0 e + 2ead()方法H I 6 , W,此处才是把 SelectionKey.OP_READ注册到NioEventLoop的select 中。
总结
NioServerSocketChannel实例的NioEventLoop不停的检测是否有新连接,获取新连接后,让NioServerSocN ^ { # O q fke S wtChannel实例的ServerBootstrapAcceptor给新连接绑定NioEventLoop并] D ~ D x * w , e注册到select,最后注册OP_READ事件,实现新连接数据的读取监听,到此整个过程完毕。需要注意的是OP_READ事件是在channelActi{ 5 8 |ve事件中设置。
本文系本站编辑转载,文章版权归原作者所有,内容为作者个人观点,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请与本站联系,本站将在第一时间删除内容!