Nett源码剖析ServerBootstrap的设置2021SC@SDUSC
2021SC@SDUSC
文章目录
- bootstrap的设置剖析
- 其他
bootstrap的设置剖析
bootstrap.group(bossGroup, workerGroup)//设置两个线程组.channel(NioServerSocketChannel.class)//使用NioSocketChannel作为服务器通道实现.option(ChannelOption.SO_BACKLOG, 128)//设置线程队列得到连接个数.childOption(ChannelOption.SO_KEEPALIVE, true)//设置保持活动连接状态.childHandler(new ChannelInitializer<SocketChannel>() {//创建一个通道测试对象(匿名对象)//给pipeline设置处理器@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new NettyServerHander());}});//给我们的workerGroup的EventLoop对应的管道设置处理器
首先是.group(bossGroup, workerGroup)
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {super.group(parentGroup);if (childGroup == null) {throw new NullPointerException("childGroup");}if (this.childGroup != null) {throw new IllegalStateException("childGroup set already");}this.childGroup = childGroup;return this;}public B group(EventLoopGroup group) {if (group == null) {throw new NullPointerException("group");}if (this.group != null) {throw new IllegalStateException("group set already");}this.group = group;return self();}
将两个线程组储存成(parent)group 和childGroup。
然后 .channel(NioServerSocketChannel.class)
public B channel(Class<? extends C> channelClass) {if (channelClass == null) {throw new NullPointerException("channelClass");}return channelFactory(new ReflectiveChannelFactory<C>(channelClass));}
这里用NioServerSocketChannel的反射创建了ReflectiveChannelFactory【反射通道工厂】
ReflectiveChannelFactory类和channelFactory方法分别是
public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactory<T> {private final Class<? extends T> clazz;public ReflectiveChannelFactory(Class<? extends T> clazz) {if (clazz == null) {throw new NullPointerException("clazz");}this.clazz = clazz;}@Overridepublic T newChannel() {try {return clazz.getConstructor().newInstance();} catch (Throwable t) {throw new ChannelException("Unable to create Channel from class " + clazz, t);}}@Overridepublic String toString() {return StringUtil.simpleClassName(clazz) + ".class";}
}public B channelFactory(ChannelFactory<? extends C> channelFactory) {if (channelFactory == null) {throw new NullPointerException("channelFactory");}if (this.channelFactory != null) {throw new IllegalStateException("channelFactory set already");}this.channelFactory = channelFactory;return self();}
ReflectiveChannelFactory是通过反射调用默认构造函数来实例化新通道的ChannelFactory。channelFactory是设置了channelFactory[通道工厂],然后返回自身,以便于后边的链式设置
.option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true)
public <T> B option(ChannelOption<T> option, T value) {if (option == null) {throw new NullPointerException("option");}if (value == null) {synchronized (options) {options.remove(option);}} else {synchronized (options) {options.put(option, value);}}return self();}public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value) {if (childOption == null) {throw new NullPointerException("childOption");}if (value == null) {synchronized (childOptions) {childOptions.remove(childOption);}} else {synchronized (childOptions) {childOptions.put(childOption, value);}}return this;}
设置线程队列得到连接个数,返回自身,设置保持活动连接状态。.childHandler()
.childHandler(new ChannelInitializer<SocketChannel>() {//创建一个通道测试对象(匿名对象)//给pipeline设置处理器@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new NettyServerHander());}});public ServerBootstrap childHandler(ChannelHandler childHandler) {if (childHandler == null) {throw new NullPointerException("childHandler");}this.childHandler = childHandler;return this;}
其实也就设置childHandler
其他
// 启动服务器。并绑定端口ChannelFuture cf = bootstrap.bind(6668).sync();//对关闭通道进行监听cf.channel().closeFuture().sync();
然后就是bind()方法,其中关键的代码流程大概是bind→dobind→initAntRegister→init→register→execute→startThread→doStartThread→run;同时还会根据注册结果绑定一个监听。
Nett源码剖析ServerBootstrap的设置2021SC@SDUSC相关推荐
- Nett源码剖析(1)NioEventloopGroup的创建2021SC@SDUSC
2021SC@SDUSC 文章目录 NioEventloopGroup new NioEventLoopGroup(): 核心 NioEventloopGroup 类结构图: 很遗憾我的idea不是旗 ...
- Nett源码剖析(2)NioEventloopGroup的创建2021SC@SDUSC
2021SC@SDUSC 文章目录 new ThreadPerTaskExecutor(newDefaultThreadFactory()); newchild 上文说到这里是NioEventloop ...
- Nett源码剖析注册通道2021SC@SDUSC
2021SC@SDUSC 在绑定端口过程中,类initAndRegister里有注册通道方法ChannelFuture regFuture = config().group().register(ch ...
- Zbar源码解析——实现中文解码|2021SC@SDUSC
2021SC@SDUSC 修改文件 zbar/qrcode/qrdectxt.c: latin1_cd=iconv_open("GB18030","UTF-8" ...
- 山东大学软件实验课程-Ebiten-基于go语言实现的2D游戏库源码分析第一篇-综述 2021SC@SDUSC
2021SC@SDUSC 目录 一.项目综述 二.go语言安装及环境配置 1.Go的安装 2.IDE的使用 三.小组内成员分工 一.项目综述 Ebiten 是Go 编程语言的开源游戏库.Ebiten ...
- Qt之布局设置setLayout详解-源码剖析(下)
一.简述 大家好,我是前行中的小猪,今天呢给大家继续上一篇Qt之布局设置setLayout详解(上)之后的内容,再给大家进行一下拓展. 1.1 setLayout源码剖析 上篇我们说到如何清空部件上的 ...
- 源码剖析 Netty 服务启动 NIO
如果这个文章看不懂的话 , 建议反复阅读 Netty 与 Reactor 开篇立意.引用网友好的建议.看源码要针对性的看,最佳实践就是,带着明确的目的去看源码.抓主要问题,放弃小问题.主要的逻辑理解了 ...
- Netty服务器启动源码剖析
Netty服务器启动源码剖析 文章目录 Netty服务器启动源码剖析 1.Netty服务器启动源码剖析 1.1.执行new NioEventLoopGroup()时发生了什么 1.1.1.NioEve ...
- 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...
最新文章
- java中json重复数据结构_JS实现去除数组中重复json的方法示例
- 中科院分子细胞中心、清华大学和Bio-protocol联手发布《高通量筛选实验手册》...
- 聊聊clean code
- python的learn_python_learn1
- 一些常见的兼容性问题
- EXCEL下载功能在XP系统中运行是好好的,到windows2003系统上,就报错
- java 数据库备份 linux,java邮件打包在linux备份数据库练习
- python自定义配置文件读取_python读取和自定义配置文件的方法
- layer 一张表按钮根据一个id 查询相关信息
- linux暂停和恢复进程
- 计算机编程培训莱阳,莱阳数控编程培训班
- 漂浮式半潜风机(二)环境荷载
- x32下PsSetLoadImageNotifyRoutine的逆向
- 分析数据流和绘制数据流图
- idea更新报Node remains in conflict冲突的解决办法
- ae镜头光晕插件Optical Flares
- 技术交流:springboot配置阿里云日志服务与log4j2 lookup
- 九种引人瞩目的开源大数据技术
- 怎么修改手机app服务器数据库,手机app服务器数据库
- struct sk_buff结构体详解
热门文章
- FPGA-基于UART的QVGA显示(一)(实现PC端发送字母数字汉字的分别显示)
- [012量化交易] python 最高价 最低价
- 金字塔(算法竞赛进阶指南)
- 安徽省计算机应用能力考试证书,合肥信息技术职业学院1084名学子成功获得了全国信息化应用能力考试合格证书...
- my web sites for HEP
- Web3 哪个赛道最有机会?带你详解Web3基础设施赛道的“超级项目”
- for example: not eligible for auto-proxying 解决
- 唐诗宋词学习·141~145节
- BAV99的ESD保护作用解析
- .NET的资源并不限于.resx文件(二)