网络编程
Blocking IO:阻塞式IO
Socket又称套接字,应用程序一般通过“套接字”向网络发出请求或者应答网络请求。
ServerSocket用于服务器端,Socket是建立网络连接时使用的。连接成功时,应用程序两端会
产生一个Socket实例。套接字是平等的,不因为在服务器端或者在客户端而产生不同的级别。
套接字之间的连接过程可以分为四个步骤:服务器监听,客户端请求
服务器端连接确认,客户端确认
网络编程的基本模型是Client、Server模型,也就是两个进程直接进行相互通信,其中服务端提供
配置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,
通过三次握手建立连接,如果连接成功,则双方既可以进行通信。
伪异步
采用线程池和任务队列可以实现一种伪异步的IO通信框架
其实就是将客户端的socket封装成一个task任务(实现Runnable接口的类)然后投递到线程池中去,
JDK 1.7 之后实现异步非阻塞,之前只是实现了非阻塞
IO(BIO)和NIO区别:本质就是阻塞和非阻塞区别
阻塞:应用程序在获取网络数据时,如果网络传输数据慢,那么程序就一直等待,直到传输完
非阻塞:应用程序直接可以获取已经准备就绪好的数据,无需等待
BIO为同步阻塞 NIO同步非阻塞 (AIO)NIO 2.0 异步非阻塞
同步和异步:一般是面向操作系统与应用程序对IO操作的层面上来区别的
同步时,应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某一方法上,直到
数据准备就绪。采用轮询的策略实时检查数据的就绪状态,如果就绪则获取数据
异步时,所有的IO读写交给操作系统,应用程序没有直接关系,当操作系统完成了IO读写操作时,
会给应用程序发送通知,应用程序直接拿走数据即可。
同步说的是server服务器端的执行方式
阻塞说的是具体的技术,接收数据的方式、状态
ByteBuffer缓冲区 Channel管道、通道 Selector选择器、多路复用器
ByteBuffer是一个对象,它包含一些写入或者要读取的数据,在NIO类库中加入Buffer对象,体现了新库
与原IO的一个重要区别,在面向流IO中,可以将数据直接写入或读取到Stream对象中。在NIO
库中,所有数据都是用缓冲区处理的(读写)。缓冲区实质上是一个数组。
ByteBuffer类型:常用的就是ByteBuffer,每一种java基本类型都对应一种缓冲区(除了Boolean类型)
ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer
NIO通信步骤
1:创建ServerSocketChannel,配置为非阻塞模式
2:绑定监听,配置TCP参数,录入backlog大小等,
3:创建一个独立的IO线程,用于轮询多路复用器Selector
4:创建Selector,将之前创建的ServerSocketChannel注册到Selector上,并设置监听标识位SelectionKey.ACCEPT
5:启动IO线程,在循环体中执行Selector.select()方法,轮询就绪的通道
6:当轮询到就绪通道时,需要进行判断操作位,如果是ACCEPT状态,说明是新的客户端接入,则
调用accept方法接受新的客户端
7:设置新接入客户端的一些参数,如非阻塞、并将其通道继续注册到Selector中,设置监听标识位
8:如果轮询的通道操作位是READ,则进行读取,构造Buffer对象等
9:更细节的还有数据没发送完成继续发送的问题。。。
AIO编程,在NIO的基础上引入了异步,并提供了异步文件和异步套接字通道的实现,从而在真正意义上
实现了异步非阻塞,AIO他不需要多路复用器对注册的通道进行轮询操作即可实现异步读写
AsynchronousServerSocketChannel //服务器通道
AsychronousScoketChanelGroup //线程组
Blocking IO:阻塞式IO
Socket又称套接字,应用程序一般通过“套接字”向网络发出请求或者应答网络请求。
ServerSocket用于服务器端,Socket是建立网络连接时使用的。连接成功时,应用程序两端会
产生一个Socket实例。套接字是平等的,不因为在服务器端或者在客户端而产生不同的级别。
套接字之间的连接过程可以分为四个步骤:服务器监听,客户端请求
服务器端连接确认,客户端确认
网络编程的基本模型是Client、Server模型,也就是两个进程直接进行相互通信,其中服务端提供
配置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,
通过三次握手建立连接,如果连接成功,则双方既可以进行通信。
伪异步
采用线程池和任务队列可以实现一种伪异步的IO通信框架
其实就是将客户端的socket封装成一个task任务(实现Runnable接口的类)然后投递到线程池中去,
JDK 1.7 之后实现异步非阻塞,之前只是实现了非阻塞
IO(BIO)和NIO区别:本质就是阻塞和非阻塞区别
阻塞:应用程序在获取网络数据时,如果网络传输数据慢,那么程序就一直等待,直到传输完
非阻塞:应用程序直接可以获取已经准备就绪好的数据,无需等待
BIO为同步阻塞 NIO同步非阻塞 (AIO)NIO 2.0 异步非阻塞
同步和异步:一般是面向操作系统与应用程序对IO操作的层面上来区别的
同步时,应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某一方法上,直到
数据准备就绪。采用轮询的策略实时检查数据的就绪状态,如果就绪则获取数据
异步时,所有的IO读写交给操作系统,应用程序没有直接关系,当操作系统完成了IO读写操作时,
会给应用程序发送通知,应用程序直接拿走数据即可。
同步说的是server服务器端的执行方式
阻塞说的是具体的技术,接收数据的方式、状态
ByteBuffer缓冲区 Channel管道、通道 Selector选择器、多路复用器
ByteBuffer是一个对象,它包含一些写入或者要读取的数据,在NIO类库中加入Buffer对象,体现了新库
与原IO的一个重要区别,在面向流IO中,可以将数据直接写入或读取到Stream对象中。在NIO
库中,所有数据都是用缓冲区处理的(读写)。缓冲区实质上是一个数组。
ByteBuffer类型:常用的就是ByteBuffer,每一种java基本类型都对应一种缓冲区(除了Boolean类型)
ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer
NIO通信步骤
1:创建ServerSocketChannel,配置为非阻塞模式
2:绑定监听,配置TCP参数,录入backlog大小等,
3:创建一个独立的IO线程,用于轮询多路复用器Selector
4:创建Selector,将之前创建的ServerSocketChannel注册到Selector上,并设置监听标识位SelectionKey.ACCEPT
5:启动IO线程,在循环体中执行Selector.select()方法,轮询就绪的通道
6:当轮询到就绪通道时,需要进行判断操作位,如果是ACCEPT状态,说明是新的客户端接入,则
调用accept方法接受新的客户端
7:设置新接入客户端的一些参数,如非阻塞、并将其通道继续注册到Selector中,设置监听标识位
8:如果轮询的通道操作位是READ,则进行读取,构造Buffer对象等
9:更细节的还有数据没发送完成继续发送的问题。。。
AIO编程,在NIO的基础上引入了异步,并提供了异步文件和异步套接字通道的实现,从而在真正意义上
实现了异步非阻塞,AIO他不需要多路复用器对注册的通道进行轮询操作即可实现异步读写
AsynchronousServerSocketChannel //服务器通道
AsychronousScoketChanelGroup //线程组