研究背景
其实我们在研究netty的时候我们必定绕不过NIO的,也必定必须研究一下这个Reactor模型的,如果不进行这个Reactor模型和NIO知识点的研究,那么我们必定掌握不了Netty的精髓,为什么呢?
-
因为Netty底层封装的就是NIO的代码,如果NIO的三大组件比如channel、buffer、以及selector不搞清楚的话那么指定是搞不懂Netty的,即使掌握了也是API层面的
-
Reactor模型简直是太经典了,Netty的模型是三种经典的Reactor模型演化过来的,而且不仅仅是Netty有这个模型,Redis、Nginx等有名的中间件都是借鉴了这个模型的思想
Reactor 模型
核心思想
Reactor模型的核心是Reactor加上对应的处理器Handler,Reactor在一个单独的线程中运行,负责监听和分发事件,将接收到的事件交给不同的Handler来处理,Handler是处理程序执行I/O事件的实际操作
基础类型
我们先说说基础的客户端服务端传统模型,这里BIO是最原生的代表,也是因为效率比较低下之后衍生出来了NIO的模型
BIO 模型
经典的类型就是BIO模型,一个客户端过来进行请求连接,那么服务端就需要进行创建一个线程进行处理链接请求,这种就是少量的客户端的话还可以,如果当大量的客户端如果进行连接请求的话,那么就会造成服务端的线程资源紧缺,而且这个过程服务器和客户端两边都是阻塞的状态,而且传统的BIO模式还存在同步效率低的问题,如果建立了链接,服务端就傻等着客户端发来请求,如果没有请求过来,那么这个线程一直在阻塞着,就造成了资源的浪费
图解
案例代码
public class BIOServer {
public static void main(String[] args) {
try {
// 服务端监听端口8080
ServerSocket serverSocket = new ServerSocket(8080);
// 服务端接收客户端链接请求
Socket socket = serverSocket.accept();
new Thread(() -> {
try {
byte[] bytes = new byte[1024];
// 将信息从输入流读取到创建的byte数组中
socket.getInputStream().read(bytes);
String message = new String(bytes, CharsetUtil.UTF_8);
System.out.println("客户端发送过来的信息是:" + message);
byte[] byteWrite = "Hello Client".getBytes(CharsetUtil.UTF_8);
// 返回信息给客户端
socket.getOutputStream().write(byteWrite);
} catch (IOException e) {
e.printStackTra