(一)Netty源码学习笔记之概念解读
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6121065.html
博主最近在做网络相关的项目,因此有契机学习netty,先是看各种的netty资料后来自己看源码,希望在此把自己的学习历程分享出来。因为我最初对netty的了解也仅限于知道它是一个优秀的网络框架,可以说是一无所知,想来想去就把这个文章系列起名《解开迷雾看netty》,也是我学习netty的真实写照。该系列的博文全部是基于Netty4。
初学者看优秀的开源代码时不知道是不是都有一个通病,就是非常迷茫,我最初在看netty时就是这种感觉,不知道从哪里下手,经常东看一点西看一点,往往形成不了连贯的思路。当我们按照一条主线看代码时也会有这样的问题,经常会因为主线两侧的内容把我们的思路带跑偏。因此,我对看源码的浅见是:一、不能乱看,沿一条主线看;二、过程中一定要及时的回归主线,否则很难形成连贯的思路。
在第一篇文章中我们首先先了解一下netty是什么以及netty中的成员,可以说是一道开胃菜,也是后面学习的基础。
套用Netty官网的一句话:Netty是一个异步的、事件驱动的网络应用框架,可以快速开发高性能的网络协议。下图是来自netty home的官方图:

从上图中可以看出,netty包含了三块:传输服务(方便我们快速开发出网络协议)、协议支持(支持了哪些现有的协议)和核心网络模型(底层核心实现)。
对于上图我们不做过多的描述,由于是学习和研究netty,所以我们的关注点也在Core上。众所周知,Netty底层是Nio以及Reactor模式,如果是小白可以先在我的另一篇博客NIO及Reactor模式中了解一下概念。
下面进入主题,我们先大概了解一下Netty和NIO中都有哪些重要的成员:
1.Channel(NIO):字面理解为“通道”,用于完成一个I/O请求,也可以理解为通信的载体。
2.Selector(NIO):选择器,也可被称为多路复用器,是实现非阻塞IO的关键。它类似于一个监听器,通过地调用select()或selectNow()可以得到目前有多少channel处于I/O就绪状态,通过调用selectedKeys()得到就绪状态的SelectionKey的集合,然后遍历这一集合便可得到所有就绪状态的SelectableChannel,进一步便可以做相应的操作。
3.Buffer(NIO):缓冲区,在NIO中数据的读写都是面向buffer的,可以理解为内存里开辟的一块临时保存数据的区域,而本质上就是一个数组,然后基于position、limit、capacity、address来操作这个数组。在netty中衍生出ChannelBuffer。
4.ChannelHandler(Netty):ChannelHandler负责与I/O无关的业务逻辑处理。可以处理或拦截ChannelInboundInvoker或ChannelOutboundInvoker操作,分别用于处理上行和下行的消息,并将其转发到ChannelPipeline中交给下一个ChannelHandler。
5.ChannelEvent(Netty):Netty是基于事件驱动的,ChannelEvent是事件(数据或者状态改变)载体,例如传输的数据对应MessageEvent,状态的改变对应ChannelStateEvent。当对Channel进行操作时,会产生一个ChannelEvent,并发送到ChannelPipeline。ChannelPipeline会选择一个ChannelHandler进行处理。这个ChannelHandler处理之后,可能会产生新的ChannelEvent,并流转到下一个ChannelHandler。
6.ChannelPipeline(Netty):Pipeline的中文含义是“管道”,传输途径。也就是说在ChannelPipeline控制ChannelEvent事件分发和传递,流转到ChannelHandler中进行处理。ChannelPipeline包含两条线路:Upstream和Downstream,分别对应上行和下行的通信。
7.ChannelFuture(Netty):在Netty中所有的I/O操作都是异步的,因此我们总是得不到最终实际的I/O结果,而是得到ChannelFuture,它会包含一些I/O执行状态的结果。ChannelFuture往往配合监听器使用,在其中注册一个监听器,当操作执行成功或失败时监听会自动触发,相当于一个回调。
8.EventLoop(Netty):Netty中的线程池模型,后面会详细介绍,下一篇将会先从boss线程和worker线程说起。
(一)Netty源码学习笔记之概念解读的更多相关文章
- (二)Netty源码学习笔记之服务端启动
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6129971.html 本文将不会对netty中每个点分类讲解,而是一个服务端启 ...
- (三)Netty源码学习笔记之boss线程处理流程
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6160194.html 本文我们将先从NioEventLoop开始来学习服务端的 ...
- Netty源码学习笔记
1.ByteBuf
- RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记----Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest ...
- RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest Roc ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- 【Netty源码学习】DefaultChannelPipeline(三)
上一篇博客中[Netty源码学习]ChannelPipeline(二)我们介绍了接口ChannelPipeline的提供的方法,接下来我们分析一下其实现类DefaultChannelPipeline具 ...
- 【Netty源码学习】ChannelPipeline(一)
ChannelPipeline类似于一个管道,管道中存放的是一系列对读取数据进行业务操作的ChannelHandler. 1.ChannelPipeline的结构图: 在之前的博客[Netty源码学习 ...
随机推荐
- 《UNIX环境高级编程》笔记——1.UNIX基础知识
这一章节侧重一些基本概念和书中用到的一些名词. 一.引言 所有的操作都提供服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储区以及获得当前时间等. 二.UNIX体系结构 其实linux常见 ...
- 第一次源码分析: 图片加载框架Picasso源码分析
使用: Picasso.with(this) .load("http://imgstore.cdn.sogou.com/app/a/100540002/467502.jpg") . ...
- 收集移动端HTML5/H5使用的插件
日期: http://t.cn/R2UOFoW 地区: http://www.jq22.com/jquery-info8371 头像: http://fex.baidu.com/webuploader ...
- centos tar压缩与解压缩命令大全
tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...
- Linux指令
文件指令 ls: ls -a :把隐藏的文件显示 ls -l 显示文件的详细信息 -lh 也是显示文件的详细信息,只是文件的大小是以k单位 ls -ld 显示指定目录下的信息 mkdir: mkd ...
- Python学习笔记(1)
001 #通过bat命令运行pyhon py文件,并将结果输出到txt文件.# D:\ResearchContent\Exercise_Programm\Start\Start.py>C:\Us ...
- http://www.cnblogs.com/kissdodog/p/4159176.html
想要自己一个人完成app,那么后台接口也必须自己动动手.不用担心,其实很简单的,给自己信心!下面就以登录注册为例,做一个api接口 首先在mac上搭建PHP环境,下载 MAMP Pro for Mac ...
- Java数据结构——树的三种存储结构
(转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...
- NoSQL指南
一.数据库发展 1.早期出现的数据库包括平面文件数据管理系统.分层数据管理系统和网络数据管理系统,分别对应的数据结构是线性表.树和图. 平面文件数据管理系统是使用磁带对数据进行顺序存储的,带来的问题不 ...
- REDHAT一总复习1 cups 打印服务配置
停止cups服务 $ sudo systemctl stop cups $ sudo systemctl status cups 配置cups服务,使其不在系统启动时启动 $ sudo systemc ...