从example开始

先看源码结构,如下图,netty包含几个核心部分:

netty源码结构

1, buffer:ByteBuf类的实现,类似jdk自带的ByteBuffer,区别是ByteBuffer读写用同一个指针,netty觉得使用麻烦,就自己开发类ByteBuf,分别维护readIndex和writeIndex。实现细节以及对比分析之后会有文章专门分析。

2, codec/codec-*:网络传输的都是字节流,程序的输入输出参数一般是java对象,所以需要编码和解码。从底层的channel读到的原始数据都存放在ByteBuf里,要写入channel的数据也必须先转换为ByteBuf。于是就有了一下几个类:ByteToMessageDecoder,MessageToMessageDecoder,MessageToByteEncoder,MessageToMessageEncoder,还有两个编码解码融为一体的类:ByteToMessageCodec,MessageToMessageCodec,顾名思义。整个codec实现细节稍后专门分析。

3,example:包含示例,此文章的重点,也是分析任何源码必不可少要看的。

4,handler/handler-proxy:此handler并不是ChannelHandler,稍后分析。

5,transport/transport-*:各种传输协议的实现,有一个有趣的发现,transport-native-kqueue/transport-native-epoll这两个模块都需要通过c调用操作系统的IO多播api,侧面也反应出一个问题:java的nio在linux/osx上应该是使用的poll,在windows上使用的select。关于此问题以及IO多播稍后专门分析。


开始本文的重点,从example中的echo开始,echo实现的功能:client初始化一个ByteBuf,填充数字,然后在connect上server之后发送这个ByteBuf到server,server直接把自己收到的数据原样返回,client收到server的响应之后,再把响应信息原样发给server。

echo server端的核心代码

ServerBootstrap和Bootstrap都继承AbstractBootstrap,区别是ServerBootstrap要处理两种channel,一个是server channel,绑定到指定端口监听client的连接,同时还要处理client的连接channel。Bootstrap只需要处理client channel。所以ServerBootstrap比Bootstrap多一组以child开头的方法用于配置client channel。

必备核心组件:

1,EventLoopGroup:顾名思义,它包含一组EventLoop,哈哈,EventLoopGroup和EventLoop都实现接口ScheduledExecutorService,所以简单的说他们都是支持调度的线程池,只是EventLoop只有一个线程,b.group()用于指定分别处理server channel和client channel的线程池,也可以使用同一个线程池。处理server channel的线程池指定了只有一个线程,原因很简单,因为它只需要处理server channel的accept,accept之后的child channel都是交给第二个线程池处理的,稍后详细分析。

2,channel:实现底层的协议以及IO模型,bind方法调用时通过反射获取实例,细节稍后分析。

3,option:指定对应channel的协议相关参数。

4,attr:指定与channel关联的key-value数据,之后在handler中可以取回。

5,handler:指定server channel的处理链,b.bind()调用时,会在指定的handler链后面加上ServerBootstrapAcceptor,此handler的作用是accept client连接,然后把child*方法设置的参数配置到child channel上。

6, childHandler:指定client channel的handler,一般第一个handler用于初始化整个handler链,详细细节稍后分析。


ServerBootstrap启动细节:

b.bind方法调用时,先通过channel指定的类的构造方法反射获取实例,然后是初始化channel实例,设置通过option方法指定的通信协议相关参数,设置通过attr方法指定的channel实例附加属性,把handler指定的handler添加到channel附加的pipeline里,第一个handler一般用于初始化整个pipeline,然后从pipeline里删除自己。最后一个步骤是把channel注册到对应的EventLoopGroup上。然后整个系统全靠EventLoopGroup上的线程检测到IO事件之后通过channel关联的pipeline的一组fire*方法触发各种事件了。


有几个对应关系一定要捋清楚了:

每个channel都自带一个pipeline,每个pipeline里有一个ChannelHandlerContext双链表,用于保存添加到pipeline的每个channel handler。channel handler分为有状态和无状态(分局有没有实例变量区分。。。),无状态的channel handler在用Sharable注解之后,同一个实例可以添加到多个pipeline,或者添加到同一个pipeline多次,否则会报错,每次添加都会检查handler里的added属性,添加成功之后改为true。ChannelHandlerContext用于维护handler,pipeline,EventLoop的关系,handler和pipeline是理论上多对多的关系,ChannelHandlerContext相当于中间表。ChannelHandlerContext每个实例都可以维护一个map,所以一个handler要维护状态有两种实现方法:1,实例变量,一个实例只能添加到一个pipeline;2,handler在ChannelHandlerContext的map上维护状态,自身是无状态的,可以多次添加到pipeline。


每部分每个组件的细节在其他文章里有分析。对netty和java nio不熟的推荐两本书:Java IO, NIO and NIO 2.pdf和netty in action.pdf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,247评论 6 543
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,520评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,362评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,805评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,541评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,896评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,887评论 3 447
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,062评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,608评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,356评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,555评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,077评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,769评论 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,175评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,489评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,289评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,516评论 2 379

推荐阅读更多精彩内容