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%

NIO模型学习笔记的更多相关文章

  1. 概率图模型学习笔记:HMM、MEMM、CRF

    作者:Scofield链接:https://www.zhihu.com/question/35866596/answer/236886066来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...

  2. Pytorch线性规划模型 学习笔记(一)

    Pytorch线性规划模型 学习笔记(一) Pytorch视频学习资料参考:<PyTorch深度学习实践>完结合集 Pytorch搭建神经网络的四大部分 1. 准备数据 Prepare d ...

  3. LDA主题模型学习笔记5:C源代码理解

    1.说明 本文对LDA原始论文的作者所提供的C代码中LDA的主要逻辑部分做凝视,原代码可在这里下载到:https://github.com/Blei-Lab/lda-c 这份代码实现论文<Lat ...

  4. HMM模型学习笔记(前向算法实例)

    HMM算法想必大家已经听说了好多次了,完全看公式一头雾水.但是HMM的基本理论其实很简单.因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察 ...

  5. 微软CodeDom模型学习笔记(全)

    CodeDomProvider MSDN描述 CodeDomProvider可用于创建和检索代码生成器和代码编译器的实例.代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集. ...

  6. GAN︱生成模型学习笔记(运行机制、NLP结合难点、应用案例、相关Paper)

    我对GAN"生成对抗网络"(Generative Adversarial Networks)的看法: 前几天在公开课听了新加坡国立大学[机器学习与视觉实验室]负责人冯佳时博士在[硬 ...

  7. Java NIO 完全学习笔记(转)

    本篇博客依照 Java NIO Tutorial翻译,算是学习 Java NIO 的一个读书笔记.建议大家可以去阅读原文,相信你肯定会受益良多. 1. Java NIO Tutorial Java N ...

  8. Java NIO 核心组件学习笔记

    背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相 ...

  9. Java NIO、NIO.2学习笔记

    相关学习资料 http://www.molotang.com/articles/903.html http://www.ibm.com/developerworks/cn/education/java ...

随机推荐

  1. 【原】git命令行查看全部分支与远程分支不同步问题

    git branch -a 查看全部分支 git fetch 重新拉一下分支

  2. nginx配置-location

    以 =开头表示精确匹配如 A 中只匹配根目录结尾的请求,后面不能带任何字符串. ^~ 开头表示uri以某个常规字符串开头,不是正则匹配 ~ 开头表示区分大小写的正则匹配; ~* 开头表示不区分大小写的 ...

  3. Shiro那些事儿(一): Shiro初探

    引言 权限,可以简单的理解成你能干什么,不能干什么.在管理系统中,对权限的设计可以很简单,也可以很复杂.简单点的,基本都是基于角色扮演的方式,比如系统管理员角色可以操作哪些菜单,普通用户角色可以操作哪 ...

  4. vux使用方法

    # 使用vux及vuex-i18n需要做的工作 ### 1.首先需要安装vux ### 2.需要安装vux-loader ### 3.需要安装vuex ### 4.需要安装vuex-i18n ### ...

  5. Iterator,foreach遍历小计

    此博客对同一操作对比两种遍历方式,以个人忘记时快速捡起为目的. 数据表: 三个List: List<Menu> menuList=menuService.getAllMenus(query ...

  6. Flask Session ,pymysql ,wtforms组件 虚拟virtualenv venv

    https://www.cnblogs.com/wupeiqi/articles/5713330.html session def create_app(): print() app=Flask(__ ...

  7. 利用select单线程点对点聊天

    select的优点与使用方法 select用单线程的方法遍历所有待读写的I/O接口, 当有接口可用时就会返回. select可设置电脑阻塞或非阻塞. 特别注意: 每次select前都要重新初始化集合和 ...

  8. SSH远程免密码的密钥登录服务(Linux,Linux)

    本次实验基于两台Linux虚拟机之间的实验,一台做服务器,一台做客户机,模拟免密码的密钥登录. 首先两台虚拟机需要可以ping通,用客户机访问服务器. sshd服务主配置文件路径: /etc/ssh/ ...

  9. HDFS 工具类

    读取HDFS上文件数据 import java.io.File; import java.io.FileInputStream; import java.io.IOException; import ...

  10. 北京邀请赛 B. Beautiful Garden

    题意:给你坐标和n个点,求最少移动的点使得n个点成等差数列 思路:既然要成等差数列,那么最起码有两个点是不动的,然后枚举这两个点中间的点的个数,近期水的要死,看了队友的代码做的 #include &l ...