电力行业做的好的招投标网站,软件开发工程师怎么考,运营商查浏览网站,光谷软件园企业网站建设公司文章目录 前言Java NIO 工作原理Selector 的创建ServerSocketChannel 的创建ServerSocketChannel 注册 Selector对事件的处理总结 前言
上篇文章《Netty 入门指南》主要涵盖了 Netty 的入门知识#xff0c;包括 Netty 的发展历程、核心功能与组件#xff0c;并且通过实例演示… 文章目录 前言Java NIO 工作原理Selector 的创建ServerSocketChannel 的创建ServerSocketChannel 注册 Selector对事件的处理总结 前言
上篇文章《Netty 入门指南》主要涵盖了 Netty 的入门知识包括 Netty 的发展历程、核心功能与组件并且通过实例演示了如何使用 Netty 构建一个 HTTP 服务器。由于 Netty 的抽象程度较高因此理解起来可能会更加复杂和具有挑战性所以本文将通过 Java NIO 的处理流程与 Netty 的总体流程比较并结合 Netty 的源码更加清晰地理解Netty。
Java NIO 工作原理
首先我们知道Netty是基于Java NIO的一个网络应用框架是在其基础上进行封装和扩展所以在深入了解Netty之前建议先对Java NIO有一定的了解所以二者对网络的连接、读取和写入的操作方式是相似的。
如上图的Java NIO的处理流程与Java NIO代码示例结合可以看到将 ServerSocketChannel 注册到 Selector 并监听各个事件后Selector 在接受到事件请求后我们业务代码对其进行判断并对应处理在使用Netty时我们似乎不需要写这些代码甚至都没有看见Selector、ServerSocketChannel这些字眼那这些代码在Netty中怎么体现的我们扒开裤子看个究竟 以上文Netty构建的HTTP服务器示例为例直接关注 ServerSocketChannel 、Selector 是什么时候创建的事件是什么时候注册以及处理的。
Selector 的创建
其实看了上篇的Netty入门可以知道 EventLoop 负责处理各种事件所以可以盲猜一下Selector 应该是在 NioEventLoopGroup 中创建的look 在 NioEventLoopGroup 的构造方法中调用 JDK 的 SelectorProvider 创建了Selector也就是 Java NIO 的代码。
ServerSocketChannel 的创建
关于 ServerSocketChannel 的创建直接找绑定端口的方法如下图
同样在 Netty 的代码 NioServerSocketChannel 的newChannel() 中也看到 Java NIO 的代码。
ServerSocketChannel 注册 Selector
下图中 ServerSocketChannel 在创建后为其分配了一个 EventLoop 并开启新的线程这也是Netty 多线程异步的体现最终在 doRegister() 调用了JDK 的接口注册了Selector 并监听了事件看见 selectionKey 应该什么都清楚了吧。
对事件的处理
既然 ServerSocketChannel 注册了Selector 并监听了事件那接下来就是当有事件来时 EventLoop 对其进行处理直接看 NioEventLoop 中的代码因为他是通过新的线程启动的所以直接看 run() processSelectedKeysPlain() 中的代码熟悉吧是监听到了某个事件可以进行处理了下面是对读事件的处理 图中 ChannelPipeline 采用了责任链模式是对事件的处理通道方便扩展。所以 Netty 中的读取事件与 Java NIO 的关系如下图。 总结
所以在接触 Netty 的之前一定要先掌握 Java NIO本文只是介绍了 Java NIO 在 Netty 中的体现、Netty 对 Java NIO 的封装让大家更方便的理解 Netty并不涉及 Netty 的高效、强大的设计之处下文将会对此进行介绍。