BIO(Blocking IO - 同步阻塞IO):顾名思义就是阻塞IO,阻塞的原因有两个方面:
- 客户端连接服务端时阻塞 主要表现在ServerSocket的accept()方法,该方法会一直等待客户端的连接
- 当客户端连接上服务端时,服务端和客户端的读写操作也是阻塞的,比如inputStream.read()、outputStream.write()
NIO(New/Non-blocking IO 同步非阻塞IO):非阻塞IO,该IO使用ServerSocketChannel进行注册绑定端口,然后设置configureBlocking(false)就是非阻塞IO
这个IO的非阻塞体现在使用了selector,selector相当与一个管家,开启这个管家并注册SelectionKey的OP_READ、OP_WRITE、OP_CONNECT、OP_ACCEPT事件,selector就会管
理相关操作,不断的轮询查看是否有这些操作,如果出现了就对其进行处理。
- NIO-reactor模式:因为数据的读写操作可能会非常耗时,所以如果使用selector对所有事件进行处理的话容错性不好,就有了reactor模式,selector负责客户端的连接过程,然后连接上之后
将相关连接通道的读写操作分发给其他线程进行处理,这时可以使用线程池专门处理这些读写事件
AIO(Asynchronous IO 异步非阻塞IO):异步非阻塞IO,该IO使用AsynchronousServerSocketChannel进行注册绑定端口,因为NIO需要一直不停的轮询查看,可以进一步省略这些过程,通
过使用操作系统OS,在有客户端连接服务端时,让OS通知我们并运行预先设置好的处理方法(此处使用了观察者模式),这样就可以做到异步,只需要预先设置好连接成功后调用的方法以
及读写操作后调用的方法就可以了。
Netty : 底层其实就是NIO,并没有使用AIO,因为AIO其实就是对NIO多进行了一次封装,而且在linux环境下调用AIO并没有更方便,但是服务器一般都部署在linux上。
netty就是采用EventLoopGroup,类似selector的管家,新建两个NioEventLoopGroup()对象,一个负责客户端的连接,一个负责数据的读取,最后注册上去就行了。
如果文章有错的地方欢迎指正,大家互相交流
参考项目:https://github.com/bjmashibing/NettyStudy