NIO学习总结

2019-06-26  本文已影响0人  Kenny_Yu

NIO

NIO称为Non-blocking I/O 或 New I/O,就是非阻塞IO或者新IO

BIO网络模型

1561534656(1).png 1561534609(1).png

由图看出BIO每次建立一个新连接都需要新建一个线程处理。且随着线程数量的增加,CPU切换线程上下文的消耗也随之增加。

NIO网络模型

1561535728(1).png

而NIO则通过selector统一接受注册事件,再通过轮循的方式检测事件注册情况。

NIO核心类

Channel:通道
Buffer:缓冲区(负责与通道进行通讯)
Selector:选择器 或 多路复用器

Channel简介

1.Channel负责传输信息,特点是双向传输。相比与BIO的流来说流是单向传输。
2.Channe是非阻塞的
3.操作Channel的唯一方式是Buffer。

Channel代码操作

// 代码片段 1:服务器端通过服务器socket创建channel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
// 代码片段 2:服务器端绑定端口
serverSocketChannel.bind(new InetSocketAddress(8000));
// 代码片段 3:服务器端监听客户端连接,建立socketChannel连接
SocketChannel socketChannel = serverSocketChannel.accept();
// 代买片段 4:客户端连接远程主机及端口
SocketChannel socketChannel = SocketChannel.open(
    new InetSocketAddress("127.0.0.1", 8000))

Buffer简介

​ 提供唯一与Channel进行交互的方式。
作用:读写Channel中的数据
本质:一块可以从中读取或写入的内存区域。被NIO包装成一个NIO Buffer对象,并提供一组便于操作内存的方法。

Buffer属性

(1)Capacity:容量。
标明数组可以容纳的最大字节长度,若超出容量,则需要将其清空后才能重新写入。
(2)Position:位置
写模式:表示当前的位置,初始位置为0,最大值为 Capacity-1
读模式:重置为0
(3)Limit:上限
写模式:最多能往Buffer中写的数据数量,此时等于Capacity
读模式:此时等于写模式下的Position值。
(4)Mark:标记
标记一个特定Position位置,可通过Buffer的Reset()方法恢复到标记位置。

Buffer使用

// 初始化长度为10的byte类型Buffer
ByteBuffer.allocate(10);
// 向byteBuffer中写入三个字节
byteBuffer.put("abc".getBytes(Charset.forName("UTF-8")));
// 将byteBuffer从写模式切换成读模式
byteBuffer.flip();
// 从byteBuffer中读取一个字节
byteBuffer.get();
// 调用mark方法记录下当前position的位置
byteBuffer.mark();
// 先调用get方法读取下一个字节
byteBuffer.get()
// 再调用reset()方法将position重置到mark位置
byteBuffer.reset()
// 调用clear方法,将所有属性重置
byteBuffer.clear()

Selector简介

负责处理所有的客户端注册,管理多个Channel。

Selector使用

// 代码片段 1:创建Selector
Selector selector = Selector.open();
// 代码片段 2:将channel注册到selector上,监听读就绪事件
SelectionKey selectionKey = channel.register(selector, SelectionKey.OP_READ);
// 代码片段 3:阻塞等待channel的就绪事件发生
int selectNum = selector.select();
// 代码片段 4:获取发生就绪事件的channel集合
Set<SelectionKey> selectedKeys = selector.selectedKeys();

SelectionKey简介

(1)四种就绪状态常量

SelectionKey常量提供了四个可监听事件的静态常量值。

OP_CONNECT:连接就绪。连接操作,Client端支持的一种操作
OP_ACCEPT:接收就绪。连接可接受操作,仅ServerSocketChannel支持
OP_READ:读就绪。
OP_WRITE:写就绪。
(2)可以获取有价值的属性

在调用Selector对象的SelectedKey方法时,会返回一个SelectionKey的集合。可以通过这个SelectionKey的集合获取当前的Channel、当前Selector的对象、Channel已就绪事件集合和所关心事件集合。

ps:本文大部分内容参考于https://blog.csdn.net/qq_28303495/article/details/89514690,他写的比我更加详细,此文只为自己学习作一个总结。

上一篇下一篇

猜你喜欢

热点阅读