您的位置:首页 > 编程语言 > Java开发

JAVA_NIO

2016-02-24 11:30 381 查看
1.定义:NIO-Non Block IO非阻塞io

2.组成核心类库:

<1>缓冲区Buffer

1)定义:buffer是一个对象,包含要写入或者要读出数据。在NIO中所有的数据都是用缓存区处理的,在读取数据时,直接读取到缓存区中;在写入数据时,写入到缓存区中。任何访问NIO的数据都是通过缓冲区进行的。

2)本质:数组,同时提供了对数据的结构化访问以及维护读写位置(limit)信息

3) 类结构图:



4)重要概念:

a.容量(capacity):缓冲区最大数据容量,不能为负值,在创建时确定,不能修改

b.界限(limit):第一个不应该被读出或写入的缓冲区位置索引,也就是位于limit后的内存不可读,也不能写

c.位置(position):用于指明下一个可以被读取或写入的缓存区位置索引。当使用Buffer从Channel中读取数据时,position的值恰好等于已经读到了多少数据。当刚刚新建一个Buffer时,其position为0,从channel中读取了2个数据到该缓存中,则position为2,指向Buffer中第3位置

d.标记(Mark):Buffer允许直接将position定位到该mark处

0<=mark<=position<=limit<=capaticy

两个重要方法:

flip():将limit设置为position所在位置,并将position设为0,使buffer的读写指针移到开始位置,调用flip后,buffer为输出数据做好准备

clear():不是清空buffer的数据,它仅仅将position置为0,将limit置为capaticy,为再次向buffer装入数据做好准备

<2>通道Channel

1)定义:可以通过channel读取和写入数据,像自来水管一样,网络数据通过channel读取和写入。与流的不同之处在于通道是双向的,流只是一个方向上移动,通道可以用于读、写或者同时读写

2)分类:

-用于网络读写的SelectableChannel(ServerSocketChannel,SockeChannel)

-用于文件操作的FileChannel

<3>多路复用器Selector

1)定义及原理:提供选择已经就绪的任务的能力。Selector会不断轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,那么这个Channel就处于就绪状态,会被Selector轮询出来,通过SelectionKey可以获取就绪Channel的集合,进行后续I/O操作

3.NIO执行流程:

<1>服务端

1)打开ServerSocketChannel,用于监听客户端的连接

2)绑定监听端口,设置连接为非阻塞

3)创建多路复用器Selector,创建Reactor线程,并启动线程

4)将ServerSocketChannel注册到多路复用器上,并监听Accept事件

5)selector在线程run方法的无限循环体内轮询准备就绪的key

6)selector监听到有新的客户端接入,处理新的接入请求,完成TCP三次握手,建立物理链路

7)异步读取客户端请求消息到缓冲区

8)对ByteBuffer进行编解码,如果有半包消息指针reset,继续读取后续的报文,将解码成功的消息封装成Task,投递到业务线程池,进行业务逻辑操作

9)将业务逻辑处理的结果encode成ByteBuffer,调用SocketChannel的异步Write接口,将消息异步发送给客户端



<2>客户端

1)打开SockeChannel,绑定客户端本地地址

2)设置SocketChannel为非阻塞模式,同时设置客户端连接的Tcp参数

3)异步连接到服务端

4)判断是否连接成功,如果连接成功,则直接注册读状态到多种复用器中,如果当前没有连接成功(异步连接,返回false,说明客户端已经发送sync包,服务端没有返回ack包,物理链路没有建立)

5)向Reactor线程的selector注册OP_CONNECT状态位,监听服务端的TCP的ACK应答

6)如果连接成功,则注册读事件到selector上

7)异步读服务端发送的消息到缓冲区中,并进行解码,然后将解码消息发送到业务逻辑线程池中处理,进行业务逻辑处理

8)将处理结果encdoe进行编码,调用socketChannel的异步Write接口,发送给服务端

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: