美文网首页
NIO学习总结

NIO学习总结

作者: Kenny_Yu | 来源:发表于2019-06-26 15:20 被阅读0次

    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,他写的比我更加详细,此文只为自己学习作一个总结。

    相关文章

      网友评论

          本文标题:NIO学习总结

          本文链接:https://www.haomeiwen.com/subject/hkmccctx.html