22 SocketIO网络编程基础概念(BIO、NIO、AIO)

xiaoxiao2021-02-28  22

1.1 socket基本概念

Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求

SocketServerSocket类库位于java.net包中。ServerSocket用于服务器端,socket是建立网络连接使用的。在连接成功的时候,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,不因为在服务器端或者在客户端而产生不同级别。不管是Socket还是ServerSocker它们的工作都是通过SocketImpl类及其子类完成的。

套接字之间的连接过程可以分为四个步骤:服务器监听、客户端请求服务器、服务器确认、客户端确认,进行通信。

以下是代码示例:

Server:

 

Client:

 

 

1.2 传统的BIO编程

网络编程的基本模型是Client/Server模型。也就是两个进程直接进行相互通信,其中服务端提供配置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接成功,则双方就可以进行通信。

 

缺陷:如果客户端多的话,那么就会建立很多线程(windows能支撑1000个线程左右,Linux支撑2000个左右),导致服务器不可能做到。

在没有出现NIO之前,采用伪异步模式处理Client端过多导致压垮服务器,但是在性能上并没有提高。使用线程池+队列的方式模拟出来的

其本质就是把接收到的Socket任务没有立即建立线程执行,而是利用线程池创建有限的线程进行执行,其他的任务放到队列中去。

 

 

1.3 IO(BIO) NIO

IO(BIO)NIO的区别:其本质就是阻塞和非阻塞的区别:

阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,那么程序就一直等着,直到传输完毕为止。

非阻塞概念:应用程序直接可以获取已经准备就绪好的数据,无需等待。

IO为同步阻塞形式,NIO为同步非阻塞形式。NIO并没有实现异步,在JDK1.7之后,升级了NIO库包,支持异步非阻塞通信模型即NIO2.0(AIO)

 

同步和异步:同步和异步一般是面向操作系统与应用程序对IO操作的层面上来区别的。

同步时,应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某一个方法上,直到数据准备就绪:或者采用轮询的策略实时检查数据的就绪状态,如果就绪则获取数据。

异步时 ,则所有的IO读写操作交给操作系统处理,与我们的应用程序没有直接关系,我们程序不需要关心IO读写,当操作系统完成了IO读写操作时,会给我们应用程序发送通知,我们的应用程序直接拿走数据即可。

同步说的是你server服务器的执行方式

阻塞说的是具体的技术,接收数据的方式、状态(io,nio)

 

 

2.1 NIO1.0

Buffer(缓冲区)Channel(管道、通道)Selector(选择器,多路复用器)

 

NIO的本质就是避免原始的TCP建立连接使用3次握手的操作,减少连接的开销。

 

2.2 Buffer

Buffer是一个对象,它包含一些要写入或者要读取的数据。在NIO类库中加入Buffer对象,体现了新库与原IO的一个重要的区别。在面向流的IO中,可以将数据直接写入或读取到Stream对象中。在NIO库中,所有数据都是用缓冲区处理的(读写)缓冲区实质上是一个字节数组(ByteBuffer)。这个数组为缓冲区提供了数据的访问读写等操作属性,如位置、容量、上限等概念。

Buffer类型:我们最常用的就是ByteBuffer实际上每一种java类型都对应了一种缓存区(除了Boolean类型)

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

DoubleBuffer

 

3.1 AIO

AIO编程,在NIO基础之上引入了异步通道的概念,并提供了异步文件和异步套接字通道的实现,从而在真正意义上实现了异步非阻塞,之前我们学习的NIO只是非阻塞而并非异步。而AIO他不需要通过多路复用器对注册的通道进行轮询操作即可实现异步读写,从而简化了NIO编程模型。也可以称之为NIO2.0,这种模式才真正的属于我们异步非阻塞的模型。

AsynchronousServerSockerChannel

AsynchronousSocketChannel

转载请注明原文地址: https://www.6miu.com/read-2649965.html

最新回复(0)