IO、NIO与Netty

IO、NIO与Netty

前言:此文主要用于记录Netty学习之后的总结与笔记,较为浅显
Demo源码地址

1.BIO、NIO、AIO

Java中有三种网络模型:BIO、NIO和AIO

1.1 BIO同步阻塞IO

BIO就是Java IO包中的一系列流 import java.io.*;

BIO作为网络编程的Server端的流时,其特点是:

  1. 一个线程只能管理一个连接;
  2. BIO是直接面向流;
  3. 流在调用read()方法时,线程是阻塞的;
  4. 线程利用率低

1.2 NIO同步非阻塞IO

NIO是Java NIO包中的一系列流 import java.nio.*;

特点:

  1. 一个线程可以管理多个连接;
  2. NIO不直接面向流,而是面向缓存区,读取时的效率更高;
  3. 当流没有数据时,当前线程是可以继续执行不阻塞线程的;
  4. 对线程的利用率提升了

NIO中比较重要的概念与组件:SelectorChannelBuffer

Selector

Selector作为NIO最外层的管理者,将服务端比作一个酒馆,其作用就好比一个酒馆中的掌柜的,客人到来就好比客户端的连接,掌柜的就负责给客人分配服务的店小二。

Channel

店小二(Channel)就负责听取客人(Client)的要求,客人将要求写在小本本上(Buffer)。

Buffer

店小二负责将小本本(Beffer)提交到后厨,后厨看到小本本上的内容,开始制作美食佳酿。好了到这里我们后端就知道了客人想要什么东西了。

NIO对比BIO的优势就在,NIO只需要一个掌柜的(一个线程中的Selector)就可以管理多个连接,而BIO需要开启多个线程(掌柜的)才行,这里一看就发现BIO对于资源是很浪费的。

NIO也有其缺点:

编程复杂,需要考虑各种复杂情况、异常处理、线程的运用,于是乎,有了Netty

1.3 AIO异步IO(不作介绍)

2.Netty

Netty是什么

Netty是基于Java开发的一个高性能、高吞吐的网络编程框架,其中包括了对NIO的封装,使用了多线程,选用了高效的线程模型。

线程模型

Reactor单线程

Reactor多线程

Reactor主从

Netty架构

Netty的线程模型就是采用上面的Reactor主从模式。主BossNioEventLoopGroup与子WorkerNioEventLoopGroup

Boss负责建立与客户端之间连接的通道(Channel),Worker则负责监听客户端通道中的消息,然后通过Handler进行处理。

Netty的组件

NioEventLoopGroup

NioEventLoopGroup维护了多个NioEventLoop,一个NioEventLoop代表一个线程。
NioEventLoop维护了SelectorTaskQueue

NioServerSocketChannel

NIO Socket网络连接服务端通道

ChannelHandler

ChannelHandler负责处理客户端到来的数据,可以由用户实现SimpleChannelInboundHandler类,重写channelRead0(ChannelHandlerContext ctx, String msg)方法,也可以使用默认的处理器例如:StringDecoderHttpServerCodecIdleStateHandler

ChannelPipeline

上述处理器,需要ChannelInitializer进行一个初始化,初始化的过程中,就使用到了ChannelPipelineChannelPipelineChannelHandlerContext之间互相依赖,使用了责任链模式

posted on 2022-06-09 16:43  lyjlyjlyj  阅读(105)  评论(0编辑  收藏  举报

导航