一、BIO
BIO ,Block-IO ,阻塞、同步的通信模式。
优势:模式简单,使用方便
劣势:并发处理能力低,通信耗时,依赖网速
原理:
1.一请求一应答:服务端通过Acceptor线程,监听客户端请求并处理
2.伪异步IO:引入线程池
BIO的主要API:Socket、ServerSocket
二、NIO
New IO/Non-Block IO,非阻塞、同步的通信模式。
优势:通过一个线程,处理大量客户端的请求。
原理:
客户端和服务端通过channel通信,NIO可以通过channel进行读和写操作。多个channel被注册到一个selecor(多路复用器)上,selector通过一个线程不断轮询channel,找出准备就绪的channel进行IO操作。
NIO与BIO实现上的区别:
- 缓冲区Buffer:
- 是将数据直接写入或读取到流 Stream 对象中。
- NIO 的数据操作都是在 Buffer 中进行的。Buffer 实际上是一个数组。Buffer 最常见的类型是ByteBuffer,另外还有 CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。
- 通道 Channel :
1.Channel是双向的,Stream流是单向的。支持同时读写。
2.Channel分类:一类是网络读写(SelectableChannel),一类是用于文件操作(FileChannel)。我们使用的是前者 SocketChannel 和 ServerSocketChannel ,都是SelectableChannel 的子类。
- 多路复用器 Selector:
NIO变成的关键。
三、AIO
Asynchronous IO,是一种非阻塞、异步的通信模式。
原理:
AIO 并没有采用 NIO 的多路复用器,而是使用异步通道的概念。其 read,write 方法的返回类型,都是 Future 对象。而 Future 模型是异步的,其核心思想是:去主函数等待时间。
AIO主要API:
AIO 模型中通过 AsynchronousSocketChannel 和 AsynchronousServerSocketChannel 实现套接字通道的通信。非阻塞,异步。
四、需要理解的问题。
1.BIO为1对1,那么NIO呢?
个人理解,BIO的1对1,是指,一个请求直到IO操作完成(不包含业务处理)这个过程,都是同一个线程进行处理。
而NIO,对于多个连接,只需要一个线程进行监听,IO操作可以交给其他线程处理。
2.什么是同步和异步?
同步:指方法由当前线程执行。同步IO指数据拷贝由当前线程完成。
异步:指方法不由本线程执行。异步IO指数据拷贝由操作系统完成。
3.什么是阻塞和非阻塞?
阻塞:指方法调阻塞用等待,执行完之后才返回。
非阻塞:指方法不需等待执行完,立即返回。