zoukankan      html  css  js  c++  java
  • NIO模型学习笔记

    NIO模型学习笔记

    简介

    Non-blocking I/O 或New I/O

    自JDK1.4开始使用

    应用场景:高并发网络服务器支持

    概念理解

    模型:对事物共性的抽象

    编程模型:对编程共性的抽象

    BIO网络模型

    阻塞IO

    BIO连接过程

    1、监听建立连接请求

    2、发起建立连接请求

    3、服务端启动新线程

    4、线程响应客户端

    5、等待客户端再次请求

    BIO网络模型缺点

    • 阻塞式IO模型
    • 弹性伸缩能力差
    • 多线程耗资源

    NIO网络模型

    特点

    非阻塞IO

    弹性伸缩能力强

    单线程节省资源

    模型图

    核心类

    Channel:通道

    特点:

    - 双向性:可读可写
    - 非阻塞性
    - 操作唯一性:只能通过Buffer操作Channel
    

    实现

    • 文件类:FileChannel
    • UDP类:DatagramChannel
    • TCP类:ServerSocketChannel/SocketChannel

    Buffer:缓冲区

    作用:读写Channel中数据

    本质:一块内存区域

    属性

    • Capacity:容量(相当于数组的长度)
    • Position:位置(相当于数组的角标)
    • Limit:上限(写模式下,limit=Capacity,读模式下,limit=从buffer中最多读取的数量)
    • Mark:标记

    Selector:选择器或多路复用器

    作用:IO就绪选择

    地位:NIO网络编程的基础

    SelectionKey简介

    • 四种就绪状态常量
    • 有价值的属性

    NIO编程实现步骤

    服务端步骤

    • 第一步:创建Selector
    • 第二步:创建ServerSocketChannel,并绑定监听端口
    • 第三步:将Channel设置为非阻塞模式
    • 第四步:将Channel注册到Selector上,监听连接事件
    • 第五步:循环调用Selector的select方法,检测就绪情况
    • 第六步:调用SelectedKeys方法获取就绪channel集合
    • 第七步: 判断就绪事件种类,调用业务处理方法
    • 第八步:根据业务需要决定是否再次注册监听事件,重复执行第三步操作

    客户端步骤

    • 连接服务器端
    • 向服务器端发送数据
    • 接收服务器端的响应

    NIO网络编程缺陷

    • 麻烦:NIO类库和API繁琐
    • 心累:工作量和难度较大
    • 有坑:Selector空轮训,导致CPU100%
  • 相关阅读:
    分享一个单例模型类Singleton代码
    异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)
    httpwebrequest 用GET方法时报无法发送具有此谓词类型的内容正文
    Oracle 存储过程的导出导入序列的导出
    通用后台模版的实现
    java流类基础练习。
    java流。基础
    java流类、、、理解不够,流太多不知怎么用好?
    java代码流类。。程序怎么跟书上的结果不一样???
    java代码流类
  • 原文地址:https://www.cnblogs.com/xujie09/p/11626625.html
Copyright © 2011-2022 走看看