尊重原创,转载注明出处,原文地址: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. JSONP跨域操作

    JSP <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3. ...

  2. 【IT】公司FTP服务器使用说明

    FTP服务器的作用:----------------------------------------------1.员工个人或者部门资料临时备份(而不是永久归档): 2.部门或员工间交换巨大资料: 3 ...

  3. react native 的图表开源组件react-native-chart-android

    react-native-chart-android是一个图表开源组件,使用方法可以去这里 由于需要在数据上加上触摸事件,而github上没有说明看源码找了半天才找到下面的解决方法,特此记录一下: 在 ...

  4. 解决IDEA中Maven加载依赖包慢的问题

    原理:maven加载jar包过程,默认的是先扫描本地仓库,若本地仓库没有,则扫描远程仓库下载.默认的conf/settings.xml文件没有配置远程仓库,所以扫描的是maven的中央仓库(在国外), ...

  5. bzoj 4016: [FJOI2014]最短路径树问题

    bzoj4016 最短路路径问题 Time Limit: 5 Sec Memory Limit: 512 MB Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点 ...

  6. Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  7. github拉取和推送

    登入github 创建一个开源项目 然后打开安装好的git 首先进入一个指定的文件夹 例如: 1)E:\>cd miaov/testGit 回车 进入E盘的testGit文件夹 2)E:\mia ...

  8. js

    1.判断是否为空 if (typeof(a)!="undefined") 2. pop()移除数组最后一个元素 var arr = [];   $('#tableid tr').f ...

  9. C# 开源框架

    一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...

  10. C#中POST数据和接收的几种方式(抛砖引玉)

    POST方式提交数据,一种众所周知的方式: html页面中使用form表单提交,接收方式,使用Request.Form[""]或Request.QueryString[" ...