Netty源码分析--初始化Options,添加处理器(四)
接上篇,我们继续进入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, 用来接收客户端连接并且将新的客户端注册到多路复用器上,便于处理后面的读写操作。
Netty源码分析--初始化Options,添加处理器(四)的更多相关文章
- Netty源码分析第2章(NioEventLoop)---->第4节: NioEventLoop线程的启动
Netty源码分析第二章: NioEventLoop 第四节: NioEventLoop线程的启动 之前的小节我们学习了NioEventLoop的创建以及线程分配器的初始化, 那么NioEvent ...
- Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化
Netty源码分析第一章:Netty启动流程 第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...
- Netty源码分析第3章(客户端接入流程)---->第1节: 初始化NioSockectChannelConfig
Netty源码分析第三章: 客户端接入流程 概述: 之前的章节学习了server启动以及eventLoop相关的逻辑, eventLoop轮询到客户端接入事件之后是如何处理的?这一章我们循序渐进, 带 ...
- Netty源码分析第4章(pipeline)---->第2节: handler的添加
Netty源码分析第四章: pipeline 第二节: Handler的添加 添加handler, 我们以用户代码为例进行剖析: .childHandler(new ChannelInitialize ...
- Netty源码分析第1章(Netty启动流程)---->第1节: 服务端初始化
Netty源码分析第一章: Server启动流程 概述: 本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的 ...
- Netty源码分析第2章(NioEventLoop)---->第3节: 初始化线程选择器
Netty源码分析第二章:NioEventLoop 第三节:初始化线程选择器 回到上一小节的MultithreadEventExecutorGroup类的构造方法: protected Multi ...
- Netty源码分析 (三)----- 服务端启动源码分析
本文接着前两篇文章来讲,主要讲服务端类剩下的部分,我们还是来先看看服务端的代码 /** * Created by chenhao on 2019/9/4. */ public final class ...
- Netty源码分析第4章(pipeline)---->第1节: pipeline的创建
Netty源码分析第四章: pipeline 概述: pipeline, 顾名思义, 就是管道的意思, 在netty中, 事件在pipeline中传输, 用户可以中断事件, 添加自己的事件处理逻辑, ...
- Netty源码分析第4章(pipeline)---->第7节: 前章节内容回顾
Netty源码分析第四章: pipeline 第七节: 前章节内容回顾 我们在第一章和第三章中, 遗留了很多有关事件传输的相关逻辑, 这里带大家一一回顾 首先看两个问题: 1.在客户端接入的时候, N ...
随机推荐
- mysql安装出现应用程序无法正常启动(oxc000007b)的解决方案
原文:mysql安装出现应用程序无法正常启动(oxc000007b)的解决方案 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/IUNIQUE/art ...
- Linux下如何生成core dump 文件(解决segment fault段错误的问题)
Linux下的C程序常常会因为内存访问等原因造成segment fault(段错误),如果此时core dump 的功能是打开的,在运行我们的可执行程序时就会生成一个名为core的文件,然后我们就可以 ...
- 一言不合就写socket的post和get请求(拼内容,然后发出去即可)
一言不合就写socket的post和get请求.写个桌面程序,利用java写get和post请求.测试成功: SocketReq.java package com.test.CipherIndex; ...
- 1-6 WebAPI基础和演示项目搭建
启动项目的时候 在控制台用dotnet MsgService.dll的方式启动. 在program.cs文件下做如下修改: 实现在控制台 自定义ip和端口,修改之后有将项目重新生成,在控制台启动项目, ...
- MFC 窗口分割与通信
一.关于CSplitterWnd类我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割. 那么我们自己如何创 ...
- OpenCV实现马赛克和毛玻璃滤镜效果
一.马赛克效果 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓. 以下OpenCV程序实现马赛克效果,通过鼠 ...
- ATS项目更新(4) 更新DLL到远程服务器
rem by jin tao rem upload dll to ta1bbn01 rem rem @echo off echo %time% set time1 = %,%%,%%,% rem ** ...
- Bézier curve
Applications in computer graphics and computer-aided design (CAD) require the rapid generation of sm ...
- OpenGL(十四) 模板测试
启用模板测试时,OpenGL会在内存中开辟一块空间作为模板缓冲区,里边保存了每个像素的"模板值",模板测试的过程就是把每一个像素的模板值与一个设定的模板参考值进行比较,符合设定条件 ...
- Selenium-简介
一.简介 Selenium是UI自动化的一个框架. Selenium1.0时代就是用js注入技术与浏览器交互. Selenium WebDriver就是调用浏览器原生的API来实现的操作.他是Clie ...