NIO核心
- Channel:通道
- Buffer:缓冲区
-
Channel 通道 简介
可以类比BIO中流的概念,但与流不同的是:流是单向输出输入,而Channel是双向性的,既可以读,也可以写
双向性
- 非阻塞性
操作唯一性
在NIO中操作Channel的唯一方式是Buffer,通过Buffer实现数据块的读写,是基于数据块的操作
Channel实现
文件类:FileChannel
- UDP类:DatagramChannel
TCP类:ServerSocketChannel /SocketChannel
Socket回顾
Channel使用
//代码片段1:服务端通过服务端socket创建channelServerSocketChannel serverChannel=ServerSocketChannel.open();//代码片段2:服务器端绑定端口serverChannel.bind(new InetSocketAddress(port));//代码片段3:服务器端监听客户端连接,建立socketChannel连接SocketChannel accept = serverChannel.accept();//代码片段4:客户端连接远程主机及端口SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8080));
Buffer(缓冲区)简介
作用:读写Channel中的数据
-
Buffer属性
Capacity:容量
(表明缓冲区最大能容纳多少字节,一旦写入的字节数超过容量,需要将其清空后才能继续向里面写入数据)
Position:位置
当写入数据时,初始的位置为0,当一个data写入到buffer后,Position会向后移动到下一个可插入数据的Buffer单元,Position最大为:容量-1<br /> 当读取数据时,Buffer会从写模式切换到读模式,此时buffer会被重置为0,当从Buffer读取数据时,Position会向后移动到下一个可读的位置
Limit:上限
在写模式下,Buffer的Limit会最多往Buffer中写多少数据,此模式下,Limit等于Capacity
当切换到读模式时,Limit表示最多能从Buffer中读取多少数据,此时Limit会被设置成写模式下的Position值Mark:标记
mark存储一个特定的Position位置,之后可以通过调用Buffer的resite方法,可以恢复到这个Position位置,依然可以从这个位置处理数据
Buffer使用
Selector-选择器-简介
作用:I/O就绪选择
- 地位:NIO网络编程的基础
selector是Java NIO中能够检测1到多个NIO 通道(Channel),并能够知晓通道是否为注入读写 事件做好准备的组件,通过selector,一个单独的线程就可以管理 多个Channel,从而管理多个网络连接
selector使用
/*** 代码片段1:创建Selector*/Selector selector = Selector.open();//代码片段2:将channel注册到selector上,监听读就绪事件SelectionKey register = serverChannel.register(selector, SelectionKey.OP_READ);//代码片段3:阻塞等待channel有就绪事件发生int select = selector.select();//代码片段4:获取发送就绪事件的channel集合Set<SelectionKey> readyKeys = selector.selectedKeys();






