特斯拉是在作死?是独孤求败?是“套路”?还是为了拯救人类?

本文基于Netty 4.1.49版本,主要分析NioEventLoop 如何处理新连接接入。

NioEventLoop 检测select是否有事件就绪

  1. NioEventLoop.run 死循环持续检测select是否有事件就绪。
  2. 调用pro1 8 S X % Q b ncess; . ]SelectedKeys处理就绪事件。
  3. 调用processSelectedKeysOptimized()方法或者processSelectedKeysPlain()方法处理就绪事件。

NioEventLoop 接受新连接

  1. 从就绪selectkey 的附件中获取NioServerSocketChannel实例(就是上篇文章中绑定端口的NioServerSocketChannel)。
  2. 调用processSelectedKey(SelectionKey k, Ab# 6 j H v , n ^ /stractNioK ? , O j a k /Channel ch)方法。
  3. 判断是否是OP_ACCEPT事件。
  4. 委托给NioSey l p *rverSocketChannel实例的unsag u k zfe.read()方法。
  5. 委托给NioServerSocketChannel实例doReadMessag5 F W w v Fes
  6. 通过NioServerSocketChannel实V J S f f z M例accepe 9 R } 3 jt方法获取一个连接SocketChannel
  7. 新连接SocketChannel包装成NioSocketChannel socketChanneX 3 e y 8 V ; ^ Dl实例。
Netty NioEventLoop新连接接入流程

新连接N4 L VioSocket7 2 M ) D ? 6 m cChanne0 p + # K i =l绑定NioEventLoop

  1. 通过NiZ p T e + %oServerSocketChannel实例的pipeliP / c une.fireChannelRead传播 sock3 k S m * d JetChannel新t e w连接
  2. NioServerSocketCA d ahannel实例的pipl K L o 7 Reline 传播到Sei x b { 3 0rverBootstrapAcceptor处理器,执行channelRead()方法。
  3. 给新连接socketChannel绑定一个NioEventLoop。

新连接注册select

  1. 把新连接注册到NioEventLoop的select上。此时不关注任何事件。

7 7 0 ! c {册SelectionKey.OP_READ事件

  1. 通过socketCha? z _ 9nnem A n y 2 d Cl.pipeline.fireChannelActive();传播channelActive事件。
  2. 委托给 新连接soketCha T _nnel.pipeline.head.channelActive方法
  3. 调用新连接soketChannel.pipeline.headreadIfIsAutoRead()方法
  4. 委托给新连接socketChann{ . 6 = s : u }el.read();方法
  5. 委托给 socketChannelp A d B k z.pipeline.read();方法
  6. 委托给 socketChannel.pipeline.tail.read();方法
  7. 委托给 socketCh7 i ? D ; s : T -annel.pipeline.head.read();
  8. 委托给 socketChannel.unsafe.beginRead();
  9. 委托给 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事件中设置。

上一篇

用数据说话,为什么说比特币仍有百倍上涨空间

你也可能喜欢

  • 暂无相关文章!

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部