网络IO的实现方式
当我们使用Socket套接字进行网络通信时,会使用如下三种方式:BIO、NIO和AIO,接下来我就分别详细介绍下这三种方式的区别。
1. BIO
BIO是Blocking IO的简写,一个套接字需要使用一个线程处理,它的过程就是建立连接、读数据、写数据,然而在这些过程中都有可能会发生阻塞。这就是为什么我们首先会接触到这种方式的原因,因为它简单,一个线程只处理一个Socket,但如果是Server端,在并发连接时就需要更多的线程才能完成工作。
工作方式如下所示:
2. NIO
NIO是Nonblocking IO的缩写,是基于事件驱动的思想,采用了Reactor模式。这也是Java在服务端系统中经常采用的一种方式,相对于BIO,NIO一个明显的优势就是不需要为每一个Socket套接字分配一个线程,而是在一个线程中可以处理多个Socket套接字相关的工作。感兴趣的可以去了解一下Reactor模式,在这里给一个链接 -> 详解Reactor
Reactor模式的运用:
3. AIO
AIO就是Asynchronous IO,即异步IO。AIO采用的是Proactor模式(如下图),AIO和NIO的不同在于,AIO在读写的时候,只需要调用相应的read/write方法,并需要传入CompletionHandler(动作完成的处理器);动作完成后,会调用CompletionHandler。NIO的通知是发生在动作之前,是在可写、可读的时候,Selector发现这些事件后调用Handler处理的。
Proactor模式:
AIO是在Java7中引入的。其实在目前服务端中都是基于NIO的,AIO和NIO最大的一个不同点在于,NIO在有通知时可以进行相关操作,读或写都可以,而AIO在有通知时表示相关操作已经完成。