netty😁

netty 源码分析 读后感

一: 回忆

1. Boostrap 与 ServerBootStrap 的启动经过

a. connect 做了啥?

connect 先调用 initAndRegister 方法, init Channel 和 register, 其中 init 主要是初始 化 channel 和其对应的 pipeline(仅添加了 ChannelInitializer) , 然后 register 时注册 eventLoop和将 ops=0注册进入selector(为啥是0 我不太懂) 和触发各几个事fireXX , 其中 fireRegistered 时, 触发到ChannelInitializer时, 才将真正在 initChannel 方法中 addLast 加入的 handle 加入其中, 自然, 这只是一种添加多个 handler 的快捷方式

然后是 connet 方法则调用 channel 的 connect 方法, 最后调用 abstractChannel 的实现即 pipeline.connect方法,而 defaultpipeline的实现是 tail.conncet, 此方法会向职责链一路调用invokeConnect 方法, 其他的context 的默认实现和 tail 一样是查找最后一个, 唯有 headContext 是调用 unsafe.connect, 最后调用 nio 的 api connect 并想 selector注册 OP_CONNECT 事件

b.bind 做了啥?

  initAndRegister 基本与客户端类似, 但不同的是, 服务端的双 eventLoop 和双 handler 在此实现, 大致是 init 时只添加了boss的 handler 和注册动作, 而 worker 则是通过 遍历selector时处理 ops 为0的事件时调用 unsafe.read 方法最后调用了 accept 方法返回 channel 添加到 messageUnsafe 中的 msg 中, 然后在 一早添加的handler 中实现 channelRead 方法将 channel取出, 然后做添加 childHandler 和 用eventLoop注册事件及注册在 selector 上,实现双 eventLoop

2. 各个事件是何时注册到 selector 上的

      ops=0 , 每次 register 都会注册

      ops=OP_READ, 没次 register 会触发 channelActive, 然后调用 unsafe.read-> tail.read, 最后在 beginRead 中注册

      ops = OP_WRITE, 这个事件用来刷新,即写完后不需要手动刷新, 自动的 flush

      ops = OP_ACCEPT , 与 OP_READ 一样, 在 beginRead 中注册

      ops = OP_CONNECT , 这个在 connect 方法一路往下, 大概在unsafe 里 注册,无啥用处

梳理一下服务端客户端交互过程

服务端启动, 调用 bind 方法, 正常 bind 后, 进入 channelActive 事件, 注册了 ACCEPT 事件, 然后客户端连接 connect 方法, 服务端进入 ACCEPT 下的 read 方法, 然后里面 doReadMessages 方法中调用了 accept 方法拿到 channel 对象封装成 netty 的 channel并放入 msg 对象中发送到职责链中 , 然后 serverbootstrap 中不同的 init(channel) 方法中加入的handler 起作用, 将客户端的 channel 对象用 workerEventLoop的 selector 注册 进入read 方法 注册 OP_READ, 然后发送消息时又进入那个if分支, 调用 unsafe.read 方法

二: codec

1.论 StringEncoder( 编码器) , StringDecoder( 解码器)是如何工作的?

StringDecoder 实现了 MessageToMessageDecoder, 重写 decode方法, 将 message(byteBuf 类型) 解成 String (toString() ? )类型, 使用 out 添加即可, 然后MessageToMessageDecoder中重写了 channelRead 方法会遍历 out, 调用职责链的其他 channelRead 方法, 而我们具体的业务比如 HttpServer 这样的工作 hanlder 都是加在最后的( addLast) , 所以客户端的数据到服务器, 是先经过解码的

StringEncoder 实现了 MessageToMessageEncoder( 对象到对象编码转换类 ), 然后重写了其中的 encode 方法, 将 String 分解成 byteBuf, 然后和 decode 类似, 将转换好的对象加入 out 即可, 而 write方法也一样来自职责链的传递, 方向与 read 相反, 最后 head.wirte 则调用 unsafe 对象的 write , 但 unsafe 的 write 并未直接写, 而是在所有职责链 write 方法都执行后, 根据 autoFlush 判断, 执行 unsafe的 flush 方法中的 doWrite, 才是真正的写

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

推荐阅读更多精彩内容