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. mysql启动以及常用命令汇总

    mysql57的启动 常用命令 : show databases        :            展示所有数据库 use  数据库名      :     连接数据库 show tables ...

  2. 2.2寸(14PIN)TFT液晶屏STM32 SPI 控制

    屏幕如图所示,共14个IO口(也可能只有13个),控制屏幕的有9个IO口 详细版介绍见:http://www.ciast.net/post/20151112.html 反面IO口图: 连接通过SPI方 ...

  3. PS操作

    笔:B 橡皮:E 新建:C+N 选取套索:L 套索后按Alt,移动 放大:Ctrl + “+” 或 Z 缩小:Ctrl + “-” 或 Alt Z / Alt ,然后用滑轮控制大小 撤销:Ctrl + ...

  4. 发布delphi程序(build with runtime package)要带哪些文件?

    Delphi提供两种方式来编译你的程序:使用包或者是单独的exe 使用包,你可以使用如下方法设置: 项目选项(菜单project->options->Packages页), 在Runtim ...

  5. 每天一个linux常用命令--ls 和 -ll 有什么区别?

    一.-ls 和 -ll  有什么区别? 1. ls 命令可以说是linux下最常用的命令之一.ll不是命令,是ls -l的别名相当于windows里的快捷方式.所以"ll"和“ls ...

  6. VLAN基础配置及Access接口

    一.实验目的 二.实验拓扑图 三.实验编址 四.实验步骤 1.基础配置 按照PC1的方式依次配好IP 打开所有设备 用ping命令测试连通性 更改主机名称 2.创建VLAN 在S1上使用两条命令创建V ...

  7. Centos7安装gearman和php扩展

    Centos7安装gearman和php扩展 标签(空格分隔): php,linux gearman所需要的依赖 yum install \ vim \ git \ gcc \ gcc-c++ \ w ...

  8. PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹

    PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹 一.使用递归获取树形菜单 数据表category(id,name,parent_id) <?php class category{ / ...

  9. Python中单下划线和双下划线

    1.双下划线开头和结尾 Python中存在一些特殊的方法,有些方法以双下划线 “__” 开头和结尾,它们是Python的魔法函数,比如__init__()和__str__等等.不用要这种方式命名自己的 ...

  10. 解决:python安装mysqldb模块报 EnvironmentError: mysql_config not found

    最近学习python操作mysql需要安装mysqldb模块 出现EnvironmentError: mysql_config not found 经网上查看,需要安装mysql客户端开发库libmy ...