目录
下一节:尚硅谷Netty系列学习笔记二《BIO代码简单示例》
前言:
了解Netty之前需要熟悉 同步、异步、阻塞、非阻塞都是什么意思。
同步是什么意思?
A调用B,需要A主动等待B处理完后返回结果!
例如:去书店,问老板 有没有xxx书,老板说等一下啊,我去找一下。你必须等待老板找完后给你返回结果!
异步是什么意思?
A调用B,A无需主动等待B的返回结果,B处理完通知A即可
例如:去书店,问老板 有没有xxx书,老板说,我去找一下。找完了给你打电话,你无需z等待老板找完!
阻塞是什么意思?
A调用B,B处理中,A一直等待的过程中,其他事什么也不做,直到B处理完毕后。
例如:去书店,问老板 有没有xxx书,老板说等一下啊,我去找一下。
然后你就等,等待过程中什么也不干。这就是阻塞了。
非阻塞是什么意思?
A调用B,B处理中,A先做其他的事情,B处理完之后,A再回来处理结果。
例如:去书店,问老板 有没有xxx书,老板说等一下啊,我去找一下。
如果你等的过程中去做一些其他的事(玩一会、看会书、聊会天),那就是非阻塞了
介绍Netty以及IO模型
Netty 是一个异步的,基于事件驱动的网络应用框架,用于快速开发高性能,高可靠性的网络IO程序。
事件驱动:可以理解为 点击一个按钮,触发一个点击事件,然后执行相关的方法!在这里,事件指的是 连接、断开、读、写等等类似的事件!
java支持三种IO模型 BOI、NIO(Netty是基于NIO之上再次封装的)、AIO
BOI:同步并阻塞
服务器的处理方式为:当客户端有连接请求时,服务器会为这个连接单独创建一个线程与之通信(就是收发数据)!
如果有多个客户端连接,那就需要创建多个线程来处理!
并且客户端连接后也并非一直需要读取操作。那么在空闲的时候,该线程就会阻塞中(等待数据传输)。大好的线程白白浪费了。
该模式的弊端如下:
1.一个连接一个线程,对硬件资源要求高!无法支撑大并发连接数
2.每个连接并不总是在IO操作,那么空闲的时候,该线程就会阻塞等待IO操作。浪费线程资源!
NIO:同步非阻塞
服务器实现模式为 一个线程处理多个请求(连接),即客户端发送的链接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理。简单示例:
这样,一个线程可以维护多个连接,提高线程效率、提高并发连接数。后续会讲到Selector(选择器)
AIO:异步非阻塞
目前不太成熟,故没有深入了解,感兴趣的可以自行去了解