I/O

BIO:JDK1.4以前我们使用都是BIO 阻塞IO
阻塞到我们的读写方法,阻塞到线程来提供性能.对于线程的开销本来就是性能的浪费.
NIO:jdk1.4 linux 多路复用技术(select模式) 实现IO事件的轮询方式:同步非阻塞的模式.这个种方式目前是主流的网络通信模式.
Mina,netty mina2.0 netty5.0—网络通信框架.比我直接写NIO要容易些 并且代码可读性更好
AIO:jdk1.7 (NIO2) 才是实现真正的异步aio,学习linux epoll模式
AIO使用的比较少,大家可以认真的学习一些思想

小结:1)BIO阻塞的IO
2)NIO select+非阻塞 同步非阻塞
3)异步非阻塞IO

3.NIO AIO原理的解读

对于网络通信而言NIO,AIO并没有改变网通通信的基本步骤,只是在其原来的基础上(serverscoket,socket)做了一个改进.

Socket <—-建立连接需要三次握手—–> serversocket

对于三次握手的方式建立稳定的连接性能开销比较大.解决方案从思想上来说比较容易 就是减少连接的次数.对我们的读写通信管道进行一个抽象.

4.NIO原理

通过selctor(选择器)就相当管家 ,管理所有的IO事件
Connction accept 客服端和服务端的读写.—–IO事件

selctor(选择器)如何进行管理IO事件
当IO事件注册给我们的选择器的时候 选择器会给他们分配一个key(可以简单的理解成一个时间的标签) 当IO事件完成过通过key值来找到相应的管道 然后通过管道发送数据和接收数据等操作.

数据缓冲区:
通过bytebuffer,提供很多读写的方法 put() get()

服务端:ServerSocketChannel
客服端: SocketChannel
选择器: Selector selector=Select.open();这样就打开了我们的选择器.

4.Selectionkey:

可以通过它来判断IO事件是否已经就绪.
key.isAccptable:是否可以接受客户端的连接
Key.isconnctionable:是否可以连接服务端
Key.isreadable():缓冲区是否可读
Key.iswriteable():缓冲区是否可写

5.如何获得事件的keys

Selectionkey keys= Selector.selectedkeys();

6.如何注册

channel.regist(Selector,Selectionkey.OP_Write);
channel.regist(Selector,Selectionkey.OP_Read);
channel.regist(Selector,Selectionkey.OP_Connct);
channel.regist(Selector,Selectionkey.OP_Accept);

6.AIO:

服务端:AsynchronousServerSocketChannel
客服端:AsynchronousSocketChannel
用户处理器:CompletionHandler接口,这个接口实现应用程序向操作系统发起IO请求,当完成后处理具体逻辑,否则做自己该做的事情.