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 ...
随机推荐
- bzoj 1233: [Usaco2009Open]干草堆tower 【想法题】
首先这题的$n^3$的DP是比较好想的 $f[i][j]$表示用前$i$包干草 且最顶层为第$j+1$包到第$i$包 所能达到的最大高度 然而数据范围还是太大了 因此我们需要去想一想有没有什么单调性 ...
- JavaScript HashTable
function HashTable() { var loseHashCode = function(key) { var hash = 0; for (var i = 0; i < key.l ...
- Model-View-ViewModel (MVVM) Explained 转摘自:http://www.wintellect.com/blogs/jlikness/model-view-viewmodel-mvvm-explained
The purpose of this post is to provide an introduction to the Model-View-ViewModel (MVVM) pattern. W ...
- HttpClient 之 4.x.x版本以上的发送Https请求
https请求比http更安全 是在http的基础上加了SSL数据加密协议. http的连接很简单,是无状态的:HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,比htt ...
- kubernetes容器集群管理部署node节点组件
发送配置文件到各个节点 [root@master ~]# scp /opt/kubernetes/cfg/*kubeconfig root@192.168.238.128:/opt/kubernete ...
- 前端工程师的新选择WebApp
作为新一代移动端应用分发入口,小程序的趋势明朗化,竞争也在急剧激烈化.战线从手机 QQ.QQ 浏览器.支付宝.手机淘宝,华为,小米等九家手机厂商推出“快应用”,再拉到了谷歌的 Instant App ...
- HTML页面仿iphone数字角标
做仿iphone样式的数字角标,用简单的css来实现 <html><head><title>角标数字</title><style type=&qu ...
- casperjs-options
The Casper class The easiest way to get a casper instance is to use the module's create() method: 最简 ...
- shell巡检草拟
#!/bin/bash phy_cpu=$(cat /proc/cpuinfo | grep "physical id"|sort | uniq | wc -l) logic_cp ...
- linux CentOS7 nginx nginx-rtmp-module搭建直播
直播配置 1. 安装 Nginx 依赖软件 yum -y install gcc gcc-c++ autoconf automake make yum -y install zlib zlib-dev ...