Netty是一个异步事件驱动的网络应用程序框架, 用于快速开发可维护的高性能协议服务器和客户端。它极大地简化并简化了TCP和UDP套接字服务器等网络编程。

BIO:(Blocking IO)

同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。

android通信 netty netty通信原理_任务队列




NIO (Non-Blocking IO)

NIO是一种同步非阻塞的I/O模型,
在Java 1.4 中引入了NIO框架,对应 java.nio 包,
提供了 Channel , Selector,Buffer等抽象。

NIO中的N可以理解为Non-blocking,不单纯是New。
它支持面向缓冲的,基于通道的I/O操作方法。
NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。

阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;

非阻塞模式正好与之相反。

对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;

对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。

android通信 netty netty通信原理_选择器_02

Selector 一般称 为选择器 ,也可以翻译为 多路复用器,选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率选择器是有用的。

Connect(连接就绪)、Accept(接受就绪)、Read(读就绪)、Write(写就绪)

Netty基本原理:

android通信 netty netty通信原理_非阻塞_03

  1. 首先server端启动时绑定本地某个端口,初始化channel,其实就是生成channel的实例对象NioServerSocketChannel。
  2. 然后将自己NioServerSocketChannel注册到某个bossGroup(其实就是让前台经理先去接待)的NioEventLoop的selector上,每个NioEventLoop包含1个selector和1个事件循环线程
  3. 然后进入到bossGroup的循环线程中,其实就是他要怎么去处理这个“接待”的过程
  • 第一步bossGroup需要去轮询accept事件,
  • 第二步就是去处理IO事件,然后和client建立连接,生成NioSocketChannel,并将NioSocketChannel注册到某个workerGroup NioEventLoop的selector上
  • 第三步处理任务队列中的任务,runAllTasks。任务队列中的任务包括用户调用eventloop.execute或schedule执行的任务,或者其它线程提交到该eventloop的任务
  1. 完事之后任务就开始进入到了wrokGroup线程组中来去真正的干活了,因为他也是一个线程组
  • 第一步是先轮询read、write事件
  • 第二步就开始处理io任务,即read、write事件,在NioSocketChannel可读、可写事件发生时进行处理
  • 第三步还是处理任务队列中的任务,runAllTasks

参考:Netty是什么和Netty的基本原理架构