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%
NIO模型学习笔记的更多相关文章
- 概率图模型学习笔记:HMM、MEMM、CRF
作者:Scofield链接:https://www.zhihu.com/question/35866596/answer/236886066来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...
- Pytorch线性规划模型 学习笔记(一)
Pytorch线性规划模型 学习笔记(一) Pytorch视频学习资料参考:<PyTorch深度学习实践>完结合集 Pytorch搭建神经网络的四大部分 1. 准备数据 Prepare d ...
- LDA主题模型学习笔记5:C源代码理解
1.说明 本文对LDA原始论文的作者所提供的C代码中LDA的主要逻辑部分做凝视,原代码可在这里下载到:https://github.com/Blei-Lab/lda-c 这份代码实现论文<Lat ...
- HMM模型学习笔记(前向算法实例)
HMM算法想必大家已经听说了好多次了,完全看公式一头雾水.但是HMM的基本理论其实很简单.因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察 ...
- 微软CodeDom模型学习笔记(全)
CodeDomProvider MSDN描述 CodeDomProvider可用于创建和检索代码生成器和代码编译器的实例.代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集. ...
- GAN︱生成模型学习笔记(运行机制、NLP结合难点、应用案例、相关Paper)
我对GAN"生成对抗网络"(Generative Adversarial Networks)的看法: 前几天在公开课听了新加坡国立大学[机器学习与视觉实验室]负责人冯佳时博士在[硬 ...
- Java NIO 完全学习笔记(转)
本篇博客依照 Java NIO Tutorial翻译,算是学习 Java NIO 的一个读书笔记.建议大家可以去阅读原文,相信你肯定会受益良多. 1. Java NIO Tutorial Java N ...
- Java NIO 核心组件学习笔记
背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相 ...
- Java NIO、NIO.2学习笔记
相关学习资料 http://www.molotang.com/articles/903.html http://www.ibm.com/developerworks/cn/education/java ...
随机推荐
- mybatis 查询一对一
官方文档 Mapper接口 public interface UserMapper { User getUser(int userId); } public interface ArticleMapp ...
- 0.OpenCV框架
reference: https://docs.opencv.org/4.1.2/ 基本使用 1.图片和视频,读写(2,8) 2.OpenCV基本数据类型(3) 3.OpenCV大型数据类型及操作:图 ...
- 【读书笔记】:MIT线性代数(4):Independence, Basis and Dimension
Independence: The columns of A are independent when the nullspace N (A) contains only the zero vecto ...
- js判断一件商品加还是减
<div class="right"> <div onclick="javascript: ClickJian(this);" data-i= ...
- Cocos2d 之FlyBird开发---GamePlay类
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 这个是游戏的核心部分:(FlyBird游戏重中之重) 创建一个物理世界(世界设置重力加速度) 在物理世界中添加一个动态的刚体(小鸟) 在物 ...
- 定时任务crond介绍
定时任务cornd crond介绍: crond是linux系统中用来定期(或周期性)执行命令或指定程序任务脚本的一种程序. 查看crontab帮助: [root@db01 ~]# crontab - ...
- C#设计模式:状态者模式(State Pattern)
一,什么是状态设计模式? 1,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2,当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是 ...
- MariaDB学习笔记(一)
一.数据类型:1.整数类型: TINYINT:1Byte SMALLINT:2Byte MEDIUMINT:3Byte INT:4Byte INTEGER:4Byte BIGINT:8Byte 2.浮 ...
- android 查看网络图片
public class MainActivity extends Activity { private EditText pathText; private ImageView imageView; ...
- 【牛客网-剑指offer】矩形覆盖
题目: 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 分析: 假设2为高,n为宽 因为高为2固定,会出现固定情况,即无论 ...