尊重原创,转载注明出处,原文地址: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源码学习笔记之概念解读的更多相关文章

  1. (二)Netty源码学习笔记之服务端启动

    尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6129971.html  本文将不会对netty中每个点分类讲解,而是一个服务端启 ...

  2. (三)Netty源码学习笔记之boss线程处理流程

    尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6160194.html  本文我们将先从NioEventLoop开始来学习服务端的 ...

  3. Netty源码学习笔记

    1.ByteBuf

  4. RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的?

    目录 RocketMQ 源码学习笔记----Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest ...

  5. RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?

    目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest Roc ...

  6. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  7. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  8. 【Netty源码学习】DefaultChannelPipeline(三)

    上一篇博客中[Netty源码学习]ChannelPipeline(二)我们介绍了接口ChannelPipeline的提供的方法,接下来我们分析一下其实现类DefaultChannelPipeline具 ...

  9. 【Netty源码学习】ChannelPipeline(一)

    ChannelPipeline类似于一个管道,管道中存放的是一系列对读取数据进行业务操作的ChannelHandler. 1.ChannelPipeline的结构图: 在之前的博客[Netty源码学习 ...

随机推荐

  1. Ubuntu下运行Shell脚本

    将一个脚本保存为带有扩展名的文件,如test.sh, 在终端上输入: chmod +x test.sh 然后输入: test.sh 终端显示: test.sh 找不到命令(后来看了鸟个私房菜,发现这样 ...

  2. 实用篇!Asp.Net数据传输压缩

    一.业务场景 公司关键业务模块之一考试系统试卷内容加载缓慢.加载失败,前方人员哀声四起,客户投诉,各种爆炸! 二.问题分析 1.试卷存储采用文本文件方式存储 引发问题:并发情况下IO频繁,造成过多的线 ...

  3. cocos初认识

    一直知道cocos是做游戏的,想学习一下,结果去官网一看就懵逼了.Cocos Creator,Cocos2d-x,cocos studio,Cocos2d-js,Cocos2d-x-lua,那一种才是 ...

  4. ReactJS webpack实现JS模块化使用的坑

    从一个原生HTML/CSS/JS模式的网页改造到ReactJS模块化的结构,需要以下步骤: (1)引用ReactJS框架 ->(2)使用webpack 工具 -> (3)配置webpack ...

  5. Unity Animator动画状态机 深入理解(三)二维混合树

    介绍二维之前,先说说一维吧~ 这个是通过旋转角度速度快慢来表现身体的大转和中转~ 通过一个-133~133的数值来进行控制. 注:后面的那个对钩是镜像的意思. 其实二维混合树并没有想象中的那么难.先来 ...

  6. Python批量扫描服务器指定端口状态

    闲来无事用Python写了一个简陋的端口扫描脚本,其简单的逻辑如下: 1. python DetectHostPort.py iplist.txt(存放着需要扫描的IP地址列表的文本,每行一个地址) ...

  7. JS点击子元素不触发父元素点击事件(js阻止冒泡)

    js阻止冒泡 <html> <title></title> <head> <meta charset="utf-8"> ...

  8. SQLite

      什么是SQLite SQLite是一款轻型的嵌入式数据库 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还快 ...

  9. 汇编实现点亮Led灯(2440)

    1.gboot.lds OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS {    . = 0x30008000;        . = ALIGN(4);    .text ...

  10. 制作宅基腐主页 && 制作个人简历--材料:BootStrap

    宅基腐主页 主页分为四大板块:导航栏,轮播图,主页内容,相关信息. 导航栏:<nav>标签,class="navbar",navbar-inverse为反色,navba ...