文档章节

Netty源码跟我读(一)

 南风吹梦
发布于 2015/11/14 01:01
字数 562
阅读 44
收藏 0

        其实很多朋友都有读源码的习惯,特别是对于一些优秀的框架,相比眼下那平庸的电影市场,开源界总是能给我辈屌丝更多的惊喜,特别是老牌的netty框架,虽然也是艰涩难懂,不过能读懂一部分已经是乐在其中了.

        首先我们总ServerBootstrap说起,socket编程,第一步,先看哪儿绑定端口,这个是入口,不过找不半天,这个类里并没找到诸如bind之类的方法,翻到它的父类,我们看到了bind方法.

在这里bind方法返回的ChannelFuture,netty一部的特性就已经显露出来了,因为ChannelFuture是可以添加listener的,在绑定完成之后,会有回调结果,不会阻塞当前线程的执行,接下来我们去看doBind方法.

可以看到,这里先调用了initAndRegister,那我们顺便看看这个方法做了什么操作.

这里我看看到,实例化了channel,眼熟的朋友一看,这是用的抽象工厂的设计模式,通过不同的工厂来实例化不同用途不同特性的对象实例,设计模式在这里就体现出来了,init方法是在ServerBootstrap中实现的,写了一大通,对channel和一些成员变量做了初始化,且不去管它,回到我们刚才看到doBind方法,if else语句主要是调用了doBind0这个方法,我们跑过去看看.


这里很明显开辟新的线程去掉哟个channel的doBind方法,这时候我们比较烦,channel这个接口的实现类非常复杂,我也不知道具体跑到哪哪儿去,看了下源码里的demo,发现用的是NioServerSocketChannel这个类的实例,向上查找,知道AbstractChannel里实现了bind方法.

无奈pipeline也是接口,还要本类里面搜一下,发现实现的是DefaultChannelPipeline,去看看.

这是TailContext中的bind方法.这里就跑到了AbstractChannelHandlerContext中的bind方法,我也迷糊了,休息一下吧,下次接续这个流程,有不对的地方欢迎大家指正.

© 著作权归作者所有

粉丝 0
博文 2
码字总数 1005
作品 0
海淀
私信 提问
Netty中Channel与Unsafe源码解读

  Channel是netty网络操作抽象类,包括网络的读,写,链路关闭,发起连接等。我们拿出NioServerSocketChannel来进行分析,NioServerSocketChannel的类图如下所示: Netty使用了聚合的方使来...

良辰美景TT
2018/07/20
0
0
杂谈篇之我是怎么读源码的,授之以渔

读源码的经历 刚参加工作那会,没想过去读源码,更没想过去改框架的源码;总想着别人的框架应该是完美的、万能的,应该不需要改;另外即使我改了源码,怎么样让我的改动生效了? 项目中引用的...

编程SHA
02/19
51
2
netty之channelbuffer

看过英文的文档源码,还是勉强解释下,分享  ChannelBuffer的实现类有多个,这里列举其中主要的几个:   1)HeapChannelBuffer:这是Netty读网络数据时默认使用的ChannelBuffer,这里的H...

石头哥哥
2012/12/08
2.1K
0
源码之下无秘密 ── 做最好的 Netty 源码分析教程

背景 在工作中, 虽然我经常使用到 Netty 库, 但是很多时候对 Netty 的一些概念还是处于知其然, 不知其所以然的状态, 因此就萌生了学习 Netty 源码的想法. 刚开始看源码的时候, 自然是比较痛苦...

永顺
2017/11/29
0
0
Netty实现原理浅析

Netty是JBoss出品的高效的Java NIO开发框架,关于其使用,可参考我的另一篇文章 netty使用初步。本文将主要分析Netty实现方面的东西,由于精力有限,本人并没有对其源码做了极细致的研 究。如...

JavaGG
2010/07/19
22.7K
18

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
4
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
7
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部