2018/1/19 Netty学习笔记(一)
这段时间学了好多好多东西,不过更多是细节和思想上的,比如分布式事物,二次提交,改善代码质量,还有一些看了一些源码什么的;
记录一下真正的技术学习,关于Netty的学习过程;
首先说Netty之前先说一下BIO,NIO和AIO的区别吧,我这里对于AIO只说个大概,下午或者晚上有时间会写个具体的,其实本来想说说websocket的不过太基础了,各位百度下就行;
BIO,NIO和AIO的区别
BIO也就是同步阻塞的I/O,由JAVA程序自己处理I/O流操作;一个线程启用I/O请求后,必须等I/O处理完毕才能进行下一步;
NIO是同步非阻塞的I/O,还是由JAVA处理应用操作,不过单独开启一个线程去做I/O处理,而且会将数据读写到一个Buffer缓冲区中,之后交由OS去进行处理,缺点是需要多路复用器不断去轮询,在触发I/O操作后,用户线程也会需要时不时的去访问查看是否已经完成(jdk7后已经使用了epoll进行了改善)
AIO也就是NIO2.0,只需要发起一个I/O请求,之后具体的I/O操作都交由系统完成,系统在完成后会自行通知程序;
不管是NIO还是AIO都是避免了传统BIO使用TCP连接创建输出和输入流通道进行通信的弊端,它们使用的是http长连接建立了一个可读写的通道(channel);
Channel 管道(这里只说网络读写的Channel (SelecttableChannel 它有两个子类SocketChannel和ServerSockerChannel)避免了传统BIO的三次握手模型建立的OutputStream,InputStream连接通道),既可以读也可以写,也可以读写同时进行,并且channel上有四种状态位,分别是(Connect 连接状态,Accept 阻塞状态,Read 可读状态,Write 可写状态)不管是读写数据都是要先进入一个Buffer中,
而Buffer其实也是一个对象,有对应JAVA八种基本数据类型的八种缓存区,但我们一般使用ByteBuffer对象进行读写的存储就够了;
Selector 多路复用器,管理着一个注册的通道集合的信息和它们的就绪状态(使用轮询),如果某个通道发生了读写操作,会被它轮询出来,并通过SelectionKey可以取得就绪的Channel集合,从而进行后续的I/O操作;
一个Selector可以管理成千上万个Channel通道,如果使用传统的轮询机制就会使得性能很底下,所以JDK使用了epoll(内部对于通道的节点位置使用红黑树存储,对于每个通道都添加了一个事件,只有当进程调用了一定的方法后,扫描才会被触发,而且可以并利用红黑树快速找到通道的节点位置)
Selector模式: 当管道注册到选择器以后,selector会分配给每个管道一个key值,相当于标签.selector选择器是以轮询的方式方式进行查找注册的所有IO事件(管道),当我们的IO事件(管道准备就绪后),selector会识别,并通过对应的key值找到对应的管道,进行相关的数据处理操作(从管道中读获写数据,读的话就是写到我们的数据缓冲区中).
每个管道都有不同的事件状态,以便选择器查找;
SelectionKey.OP_CONNECT
SelectionKey.OP_ACCEPT
SelectionKey.OP_READ
SelectionKey.OP_WRITE
//Buffer api
public void test() {
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
byteBuffer.put((byte) 1);
byteBuffer.put((byte) 2);
System.out.println(byteBuffer);
// 打印此缓冲区,注意看它的结构 java.nio.HeapByteBuffer[pos=2 lim=10 cap=10]
// pos:相当于一个游标,lim是具体长度,cap是容量上限,可以看到现在lim长度不对
// 复位
byteBuffer.flip();
System.out.println(byteBuffer);
// 此时再打印 java.nio.HeapByteBuffer[pos=0 lim=2 cap=10]可以看到游标变成了0,lim也正常了;
//为什么会这样?
/* public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}*/
//看源码就知道了,那么如果不复位会发生什么呢?当你想取得数据的时候会发现会把后面没有数据的部分也打印出来
//我们在复位的情况下打印下试试
for (int i = 0; i < byteBuffer.limit(); i++) {
byte b = byteBuffer.get(i);
System.out.print(b+"\t");
}
//结果为1 2
//再看看不复位的情况下是什么 1 2 0 0 0 0 0 0 0 0 ,也就是说我们要保证limit,也就是实际长度的准备性
//事实上,如果我们使用调用get()方法,也就是不通过索引查找数据,并且在没有复位的情况下,会连1 2都显示不出来,而是直接显示后面的默认值数据,因为get方法是以pos游标当前处往后推,并且还会导致溢出异常,因为不复位的情况下,limit是最大容量,也就是10;就算是默认值数据,也是以下标为准的,也就是10个数据,最大下标就是9,而get()会一直到10;
}
2018/1/19 Netty学习笔记(一)的更多相关文章
- $2018/8/19 = Day5$学习笔记 + 杂题整理
\(\mathcal{Morning}\) \(Task \ \ 1\) 容斥原理 大概这玩意儿就是来用交集大小求并集大小或者用并集大小求交集大小的\(2333\)? 那窝萌思考已知\(A_1,A_2 ...
- Netty学习笔记(二) 实现服务端和客户端
在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...
- Netty 学习笔记(1)通信原理
前言 本文主要从 select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始. Netty 的通信原理 Netty 底层 ...
- Netty学习笔记-入门版
目录 Netty学习笔记 前言 什么是Netty IO基础 概念说明 IO简单介绍 用户空间与内核空间 进程(Process) 线程(thread) 程序和进程 进程切换 进程阻塞 文件描述符 文件句 ...
- Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例
在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...
- Netty学习笔记(二)——netty组件及其用法
1.Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 原生NIO存在的问题 1) NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector.Se ...
- Netty学习笔记(一):接收nodejs模拟表单上传的文件
好久不写博客了,也好久不写代码了,这两天临时遇上一个事情,觉得不难,加上觉得手有些生,就动手做了一下,结果遇上了不少坑,有新坑,有老坑,痛苦无比,现在总算差不多了,赶紧记录下来,希望以后不再重复这种痛 ...
- Netty学习笔记(一)
学习圣思园Netty笔记,个人理解 2.netty宏观理解-本节内容: 1.阶段性事件驱动,一个请求分为若干阶段处理,每个阶段根据情况合理分配线程去处理,各阶段间通信采用异步事件驱动方式. 2.net ...
- Netty学习笔记(三) 自定义编码器
编写一个网络应用程序需要实现某种编解码器,编解码器的作用就是讲原始字节数据与自定义的消息对象进行互转.网络中都是以字节码的数据形式来传输数据的,服务器编码数据后发送到客户端,客户端需要对数据进行解码, ...
随机推荐
- MVC 统一异常处理
在出现异常时,我们不希望将错语的原因让客户看见,常常会做一个404错误页面,将所有发生的异常都跳至该页面,并把异常信息写在日志中.步骤如下: 1.让我们看看Global.asax页面Applicati ...
- c# for 和 foreach 的区别
foreach 能够进行foreach的类型结构,都必须实现IEnumerable接口. IEnumerable接口,有一个GetEnumerator的方法,返回一个实现IEnumerator接口的对 ...
- 【老司机经验】CC2530&STM8S105二合一嵌入式学习板设计思路与经验分享
CC2530&STM8S105二合一嵌入式学习板设计思路与经验分享 1.缘起 这些年来一直在其他公司的实验箱和别人的开发板上进行教学与开发工作,总是觉得功能设计不那么合意.心里突然冒出个 ...
- javaScript事件流是什么?
一.事件 事件是文档或者浏览器窗口中发生的,特定的交互瞬间. 事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字. 事件是javaScript和DOM之间交 ...
- 国寿e店/人寿云参会云助理,不去公司就能刷脸考勤打卡?
自从2017年3月平安保险公司实行E行销打卡考勤以来,保险增员迅猛增加,保险业绩也随之水涨船高.年底开始中国人寿保险也陆续开始实行app考勤,有些需要连接公司指定WiFi,或在指定地点方可打卡考勤.不 ...
- O2O网站
编辑 020是新型的网络营销模式,O2O即Online To Offline,线下销售与服务通过线上推广来揽客,消费者可以通过线上来筛选需求,在线预订.结算,甚至可以灵活地进行线上预订,线下交易.消费 ...
- DEDECMS首页调用图片集里的多张图片
本文给大家分享的是织梦系统中首页调用图片集里的多张图片的方法,有相同需要的小伙伴可以参考下. 先找到include/common.inc.php文件,把下面代码贴进去(我贴的是我网站上的,具体可根据需 ...
- bootstrap简单图文环绕效果
一. 下载bootstrap-3.3.7 二. 在html页面引入css,js; eg: <link src="bootstrap-3.3.7-dist/css/b ...
- ajax和跨域
一.简介 ajax是什么? AJAX(Asynchronous JavaScript and XML) 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX, (异步的JavaSc ...
- ASP.NET导出word实例
ASP.NET导出word实例 最近遇到一个题目就是如何在asp.net中将数据导出到word中,由于数据是动态的,所以需要在后台拼出想要的的格式,翻遍了网页找出了一个比较满意的代码,感谢那位高手.代 ...