当前位置: 首页 > news >正文

Netty Channel 详解

优质博文:IT-BLOG-CN

一、Netty 服务端启动过程

【1】创建服务端Channel
【2】初始化服务端Channel
【3】注册Selector
【4】端口绑定:我们分析源码的入口从端口绑定开始,ServerBootstrapbind(int inetPort)方法,实际上是AbstractBootstrapbind(int inetPort)方法。ServerBootstrap继承了AbstractBootstrap

二、分析服务端创建Channel的过程

【1】bind()【分析入口,端口绑定】在bind()方法中,有一个doBind()方法,处理端口绑定:

public ChannelFuture bind(SocketAddress localAddress) {validate();if (localAddress == null) {throw new NullPointerException("localAddress");}return doBind(localAddress);// 实际绑定
}

【2】在doBind()方法中,调用initAndRegister来处理初始化和注册:

private ChannelFuture doBind(final SocketAddress localAddress) {final ChannelFuture regFuture = initAndRegister();// 初始化与注册// ...
}

【3】initAndRegister()【初始化并注册】进入initAndRegister()方法里面,发现是调用了channelFactory(Channel工厂) 的newChannel()来创建channel

final ChannelFuture initAndRegister() {Channel channel = null;try {channel = channelFactory.newChannel();// channelFactory创建Channelinit(channel);}//...
}

【4】newChannel()【创建服务端channel】进去newChannel()方法,就能看到,实际上是通过反射Class.newInstance()来创建Channel对象的:

public T newChannel() {try {return clazz.newInstance();// Channel工厂通过反射,来创建Channel} catch (Throwable t) {throw new ChannelException("Unable to create Channel from class " + clazz, t);}
}

那么,这个class到底是啥呢,什么时候传递进来的?

【5】ChannelFactory的初始化:【接收服务端ChannelClass,通过反射生成Channel】还记得之前我们的第一个Demo里面有一个channel()方法,我们传递了一个参数NioServerSocketChannel.class

ServerBootstrap serverBoot = new ServerBootstrap();
serverBoot.group(bossGroup,workGroup).channel(NioServerSocketChannel.class)// 设置服务端Channel//...
);

进去channel()方法中:

public B channel(Class<? extends C> channelClass) {if (channelClass == null) {throw new NullPointerException("channelClass");}return channelFactory(new ReflectiveChannelFactory<C>(channelClass));// 传递class给ChannelFactory的构造方法
}

然后,我们进去ChannelFactory的构造方法里面:

public ReflectiveChannelFactory(Class<? extends T> clazz) {if (clazz == null) {throw new NullPointerException("clazz");}this.clazz = clazz;// 接收传递进来的Channel的Class
}
@Override
public T newChannel() {try {return clazz.newInstance();// 通过Channel的Class反射生成Channel对象} catch (Throwable t) {throw new ChannelException("Unable to create Channel from class " + clazz, t);}
}

到此,Channel的创建过程就出来了,一句话总结就是:通过我们在ServerBootstrapchannel(clazz)方法里面设置的Class,通过Java反射,Class.newInstance来生成最终的Channel对象。

http://www.lryc.cn/news/167055.html

相关文章:

  • 技师学院物联网实训室建建设方案
  • SpringBoot项目--电脑商城【增加/减少购物车商品数量】
  • CSS元素浮动
  • MATLAB中islocalmin函数用法
  • Python+Requests+Pytest+YAML+Allure实现接口自动化
  • 双视觉Transformer(Dual Vision Transformer)
  • MES系统成为工业4.0首选,制造业真正数字化车间你看过吗?
  • Vuex有几种属性以及它们的意义
  • PRBP20P-10/250C-EB、PRDP6G-10/30-CB电液比例直动式先导减压阀放大板
  • GDB之常见缩写命令(十九)
  • MarkText快捷键(随时补充中)
  • 每日一题 1601最多可达成的换楼请求数目(子集模版)
  • 排序算法-归并排序
  • vue3 整合 springboot 打完整jar包
  • 依赖倒转原则是什么?
  • 什么是GPT与MBR
  • 前后端开发接口联调对接参数
  • 定时任务框架-xxljob
  • idea项目配置三大步
  • 学会SpringMVC之自定义注解各种场景应用,提高开发效率及代码质量
  • 步态识别常见模块解读及代码实现:基于OpenGait框架
  • 前端八股文之“闭包”
  • 数据可视化:掌握数据领域的万金油技能
  • Apache Kafka 基于 S3 的数据导出、导入、备份、还原、迁移方案
  • 事务管理AOP
  • Java从Tif中抽取最大的那张图进行裁剪成x*y份
  • 人工智能AI界的龙头企业,炸裂的“英伟达”时代能走多远
  • 【实战】H5 页面同时适配 PC 移动端 —— 旋转横屏
  • 使用凌鲨进行聚合搜索
  • 程序设计之——手把手教你如何从Excel文件中读取学生信息