Netty源码分析--初始化Options,添加处理器(四)

本文深入剖析Netty框架中ServerBootstrap的initAndRegister方法,详细解读如何设置Channel配置,初始化Pipeline,以及创建并添加ServerBootstrapAcceptor用于处理客户端连接。

接上篇,我们继续进入AbstractBootstrap类的 initAndRegister() 方法

进入init()方法

设置父级Channel的options,

进入到上节提到的NioServerSocketChannelConfig

其实就是为我们的channel.config()设置全局属性,当然我们也可以设置attr。

继续看,从channel中获取新创建的pipeline,获取我们初始化的childOptions和childAttrs,我们这里都是null,因为我们并未通过引导器ServerBootStrap来设置。

然后调用了pipeline的addLast方法,传入了一个抽象方法的实现类,这个类就是当前的此类,ServerBootstrap, 这里要注意

继续代码跟进去,我们debug看一下

继续跟

进入 newCtx = newContext(group, name, handler);

 

我们看,这里childExecutor由于传入的事件循环组是null,所以childExecutor(group)的返回时null, 并且 new 了一个 DefaultChannelHandlerContext 。

进入构造方法

将ServerBootstrap 赋给成员变量 handler , isInboud(handler) 和 isOutbound(handler) 是用来判断是入站处理器还是出站处理器

确认一下,看到ServerBootstrap 继承的这类 ChannelInitializer 继承了 入站处理器的适配器, 也就是  isInboud(handler) = true  , isOutbound(handler)  = false

继续进去父类的构造方法 ,赋值成员变量, 这个时候executor 是 null, 也就是说这里还没有指定当前的这个channel 以后由那个线程来处理

总结一下就是创建了一个上下文包裹了这个ServerBootstrap

我们继续往下看:

把刚刚创建的这个上下文 添加到 pipeline的列表中

现在就变成了这样的层级关系 HeadContext -> ServerBootstrap -> TailContext

看到这里大家或许会有一些疑问,为什么把ServerBootstrap添加到链表中?而不是我们最开始的那个LoggingHandler呢?

其实

这里只是添加一个抽象方法的实现类进去,并没有真正调用initChannel的方法,这个要注意,这个在后面channel注册完后会来调用,并且会把我们当前添加的这个ServerBootstrap从链表中移除掉,这个我们后面再说。

同时值得注意的是,这里还初始化了一个ServerBootstrapAcceptor类,没错这个就是acceptor, 用来接收客户端连接并且将新的客户端注册到多路复用器上,便于处理后面的读写操作。

转载于:https://www.cnblogs.com/huxipeng/p/10994453.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值