- 传统的同步阻塞式IO编程、伪异步IO实现
- Socket
- Socket即套接字,通过TCP3次握手,4次挥手实现,建立连接的过程分为4个步骤
- 服务器监听
- 服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络的状态
- 客户端请求服务器
- 客户端的套接字提出连接请求,要连接的目标是服务端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字所在的IP和端口号,然后就向服务器套接字发送连接请求
- 服务器确认
- 当服务器套接字监听到(接收到)客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务端套接字的描述发送给客户端
- 客户端确认
- 一旦客户端确认了此描述,连接就建立好了。双方开始进行通信,而服务端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求
- 传统Socket的缺点
- 每次建立了连接,都会起一个新的线程对这个连接进行通信处理,那么,当连接的数量增大的时候,会消耗很大的性能,而且连接的建立也是非常有限的
- 伪异步IO实现
- 解决了每次建立连接都要建立线程的问题
- 解决方式:线程池+队列
- 基于NIO的同步非阻塞式编程(Non-Block IO)
- 阻塞和非阻塞:
- 阻塞:程序在获取网络数据的时候,如果网络数据还没有完全发送完毕,那么程序会一直等待着,知道传输完成才进行进一步处理
- 非阻塞:程序直接获取已经准备就绪的网络数据,无需等待
- 同步和异步:
同步和异步一般是面向操作系统与应用程序对IO操作的层面上来区别的
- 同步:同步时,应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某个方法上,直到数据准备就绪,或者采用轮询的策略实时检查数据的就绪状态,如果就绪则获取数据
- 异步:异步时,则所有的IO读写操作就给操作系统处理,与我们的应用程序没有直接关系,我们的程序不需要关心IO读写,当操作系统完成了IO读写操作时,会给我们的应用程序发送通知,我们的应用程序直接拿走数据即可
** 同步和阻塞 **
- 同步说的是Server服务端的执行方式
- 阻塞说的是具体的技术,接收数据的方式、状态(NIO/IO)
- IO和NIO的区别:
- Buffer缓冲区
- Buffer是一个对象,实际上是一个数组,通常它是一个字节数组(ByteBuffer),它包含了一些要写入或者读取的数据,并提供了访问和操作数据的API
- 除了Boolean,每一个基本数据类型都对应了一个缓冲区,但是最常用的还是ByteBuffer
ByteBuffer/CharBuffer/ShortBuffer/IntBuffer/LongBuffer/FloatBuffer/DoubleBuffer
- 在NIO类库中加入Buffer对象,体现了新库与原IO的一个重要区别
- 在面向流的IO中,可以将数据直接写入或读取到stream对象中
- 在NIO库中,所有数据都是用缓冲区读写的
- Channel管道/通道
*
- Selector选择器/多路复用器
*
- NIO本质
- 避免原始的TCP建立连接使用3次握手的操作,减少连接的开销
- 基于NIO2.0的异步非阻塞式(AIO)编程
- AIO不需要通过多路复用器对通道进行轮询操作即可实现读写,因此是异步的,简化了NIO编程模型
posted @
2019-12-28 15:44
默月
阅读(
119)
评论()
编辑
收藏
举报