目录
IO的通信模式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。
BIO:同步阻塞IO模式
BIO是最传统的网络通信模式,通信模式是首先服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,此时就进入了同步阻塞模式的通信,客户端Socket发送一个请求,服务端Socket处理后进行响应,响应必须是处理完以后,在这之前任何事情都干不了。通常服务端Socket需要对每个请求建立一个线程来服务这个客户端。
当面对几万甚至成千上百万的请求时,该模式就显得效率低下,会导致服务器负载过高,最后崩溃等。因此我们需要更加高效的网络通信模式。
BIO通信模式图:
NIO:同步非阻塞IO模式
jdk1.4以后引入了NIO,对应 java.nio 包,是基于 Reactor 模型的一种同步非阻塞IO模式。
nio 包提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 一般是将数据写入 Buffer 中,然后从 Buffer 中读取数据,有 IntBuffer、LongBuffer、CharBuffer等多种基础的数据类型Buffer。Channel 是提供数据读写的,Selector 是一个多路复用器,Selector 会不断的轮循注册的 channel ,如果某个 channel 上发生了读写事件,Selector 就会将 channel 获取出来,通过 selectionKey 获取有读写事件的 channel ,就可以进行IO操作。一 个 Selector 通过一个线程,就可以轮循成千上万个 channel ,也意味着可以接入成千上万的客户端。
NIO提供了与传统BIO模型中的 Socket
和 ServerSocket
相对应的 SocketChannel
和 ServerSocketChannel
两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。
NIO通信模式图:
在NIO的处理方式中,Selector 轮循 channel 也是同步的,还有开启线程进行处理,可能会等待后端应用的资源(JDBC连接等),其实这个线程就被阻塞了,当并发上来的话,还是会有BIO一样的问题。
AIO:异步非阻塞IO模式
是基于 Proactor 模型的一种异步非阻塞模式。
基于事件和回调机制实现:每个请求过来,都会绑定一个 buffer,然后通知操作系统异步完成,此时客户端可以执行其他逻辑,等待操作系统执行完以后,就会回调你的接口,通知你异步操作完成,然后你对数据进行处理并把结果往回写,写的时候也是给操作系统一个 buffer,让操作系统自己来读并完成写操作,写完以后再来通知你。
这篇文章说的也很好,值得参考:http://ifeve.com/netty-2-5/