Netty-ChannelInitializer-实现原理

Netty源码分析系列之服务端Channel注册 Netty中服务端channel是如何注册到多路复用器上的? 阅读详情

在之前的文章中解读了Netty对于一条连接的各个状态的生命周期进行了解读

1、ChannelInitializer的实现原理

  • 在定义handler的时候通过childHandler()方法设置了一个handle/也就是ChannelInitializer
  • 在ChannelInitializer的initChannel()方法中,通过获取channel对应的管道,在里面加入各种方法
//xxxxxxxxxxxxxx省略代码```
.childHandler(new ChannelInitializer<NioSocketChannel>() {
    protected void initChannel(NioSocketChannel ch) {
        ch.pipeline().addLast(new LifeCyCleTestHandler());
        ch.pipeline().addLast(new PacketDecoder());
        ch.pipeline().addLast(new LoginRequestHandler());
        ch.pipeline().addLast(new MessageRequestHandler());
        ch.pipeline().addLast(new PacketEncoder());
    }
});
  • ChannelInitializer其实就利用了Netty的处理程序生命周期中channelRegistered()与handlerAdded()两个特性

2、ChannelInitializer类源代码

 protected abstract void initChannel(C ch) throws Exception;

    public final void channelRegistered(ChannelHandlerContext ctx) throws Exception {
        // ...
        initChannel(ctx);
        // ...
    }

    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        // ...
        if (ctx.channel().isRegistered()) {
            initChannel(ctx);
        }
        // ...
    }

    private boolean initChannel(ChannelHandlerContext ctx) throws Exception {
        if (initMap.putIfAbsent(ctx, Boolean.TRUE) == null) {
            initChannel((C) ctx.channel());
            // ...
            return true;
        }
        return false;
    }

1、ChannelInitializer定义了一个抽象的方法initChannel(),这个抽象方法由我们自行实现,我们在服务端启动的流程里面的实现逻辑就是往pipeline里面塞我们的handler链
2、handlerAdded()和channelRegistered()方法,都会尝试去调用initChannel()方法,initChannel()使用putIfAbsent()来防止initChannel()被调用多次。在handlerAdded()方法被调用的时候,通道其实已经和某个线程绑定上了;
3、handlerAdded()与handlerRemoved():通常可以用在一些资源的申请和释放
4、channelActive()与channelInActive():TCP连接的建立与释放
5、channelRead():解包粘包原理,服务端根据自定义协议来进行拆包,其实就是在这个方法里面,每次读到一定的数据,都会累加到一个容器里面,然后判断是否能够拆出来一个完整的数据包,如果够的话就拆了之后,往下进行传递。
6、channelReadComplete():我们在每次向客户端写数据的时候,都通过writeAndFlush()的方法写并刷新到前面,其实这种方式不是特别高效,我们可以在之前调用writeAndFlush()的地方都调用write()方法,然后在这个方面里面调用ctx.channel().flush()方法,相当于一个批量刷新的机制,当然,如果你对性能要求没那么高,writeAndFlush()就可以。

Netty 源码分析 09 ChannelHandler ChannelHandler(一) @Sharable注解,ChannelHandler 是否可共享,即是否可以被多次添加 ChannelInitializer ,一个特殊的 ChannelHandler ,用于 Channel 注册到 EventLoop 后,执行自定义的初始化操作。一般情况下,初始化自定义的 ChannelHandler 到 Channel 中 对于#h... 阅读详情

相关推荐

微信本地数据解密实战:从AES加密原理到EnMicroMsg.db恢复指南

数据加密是保障信息安全的核心技术,其中对称加密算法AES因其高效可靠,被广泛应用于各类本地数据保护场景。其原理是通过特定密钥对数据进行混淆转换,确保未经授权者无法读取原始内容。在移动应用领域,本地数据库加密对于保护用户隐私、防止数据泄露具有重要价值。微信作为国民级应用,对其本地存储的聊天记录数据库(EnMicroMsg.db)采用了基于设备标识和用户UIN生成的AES-256-CBC加密方案。理解这一机制,不仅有助于在合法合规前提下进行个人数据备份与恢复,也为开发者进行客户端安全分析、兼容工具开发提供了基础

weixin_30764883的博客 568

Netty中ChannelInitializer的使用

Netty中ChannelInitializer的使用

Lemon_MY的博客 5592

U盘文件变exe?3步教你用火绒+批处理脚本恢复隐藏文档(附注册表修复)

本文详细解析了U盘文件被病毒隐藏并伪装成exe文件的原理,并提供了三步解决方案:首先使用火绒安全软件进行全盘查杀清除病毒;其次通过批处理脚本批量恢复被隐藏的文件属性;最后修复被篡改的注册表设置,彻底解决文件无法显示的问题,帮助用户安全找回数据并加固系统防护。

weixin_28622215的博客 913

Netty源码解析之ChannelInitializer(三十六)

ChannelInitializer是一种特殊的ChannelInboundHandler,可以通过一种简单的方式(调用initChannel方法)来初始化Channel。 注意:当initChannel被执行完后,会将当前的handler从Pipeline中移除。 执行流程,点击 ServerBootstrap 类: 1、 2、点击AbstractBootstrap 类: // 服务器绑定端口监听 ChannelFuture f = b.bind(port).sync(); .

nandao158的博客 1334

Multisim仿真入门:单相半波可控整流电路从搭建到波形分析(附避坑指南)

本文为电力电子技术初学者提供了一份详细的Multisim仿真指南,手把手教你从零搭建单相半波可控整流电路。通过对比纯电阻、阻感负载及加入续流二极管后的波形变化,直观理解晶闸管触发、电感续流等核心原理,并附有实用的参数设置与常见问题避坑指南,帮助你将抽象理论转化为可视化的工程实践。

weixin_29208077的博客 343

EPSON RX8010SJ RTC实战:I2C寄存器配置避坑指南(附完整初始化代码)

本文详细解析了EPSON RX8010SJ RTC芯片在I2C寄存器配置中的常见问题与解决方案,包括TEST位、STOP位和中断控制等关键配置要点。通过实战经验分享和完整的初始化代码模板,帮助开发者避免常见陷阱,确保RTC模块的稳定运行。

weixin_28678831的博客 405

netty理论之源码分析⑥ 细讲ChannelInitializer

1.ChannelInitializer是啥 一种特殊的ChannelInboundHandler,它提供了在通道注册到eventLoop后初始化通道的简单方法,ChannelInitializer的主要目的是为程序员提供了一个简单的工具,用于在某个Channel注册到EventLoop后,对这个Channel执行一些初始化操作。ChannelInitializer虽然会在一开始会被注册到Cha...

weixin_39666581的博客 3609

Windows 11 安装 OpenClaw(龙虾):不用WSL、不用虚拟机、启动、使用、停止、卸载

本文详解 Windows 11 原生安装 OpenClaw(龙虾)全流程,无需 WSL 或虚拟机。涵盖环境配置、安全警示、模型接入(如通义千问)及技能初始化。提供启动、文件自动化操作、停止与卸载的完整指南,并附常见认证过期解决方案。助您快速部署本地 AI 智能体,实现电脑操作自动化,提升工作效率。

寒水馨 · 轻量级技术文档 · hanshuixin.org 897

15-ChannelInitializer

文章目录ChannelInitializer一、继承关系二、源码2.1 注释2.2 源码分析2.3 handlerAdded和channelRegistered三、使用示例 ChannelInitializer ChannelInitializer 是一种特殊的 ChannelHandler,它也是一种 ChannelInboundHandler,它提供了在通道注册到 EventLoop 后初...

my_momo_csdn的博客 1959

锂电池的充电和放电曲线解读

锂电池充放电曲线是反映其性能的关键指标。充电曲线分为恒流和恒压两阶段:恒流阶段电压快速上升,恒压阶段电流逐渐降低;放电曲线则呈现平台期和快速衰减期特征。这些曲线受温度、充放电倍率及材料体系(如三元锂或磷酸铁锂)显著影响。通过分析曲线特征,可优化电池管理系统,实现精准的SOC估算、快充策略制定及故障诊断,从而在电池性能与安全性间取得平衡。不同应用场景(如新能源汽车或消费电子)对曲线形态有特定要求。

start_up_go的博客 5063

创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—ISP图像处理开发案例

创龙科技研发的 TL3588-EVM 评估板具备强大视频处理能力,可满足多场景视频开发需求。为助力开发者快速上手,本文整理 7 个实用视频开发案例,涵盖从采集到显示的全流程,详细说明各案例的硬件连接、参数配置与代码解析,帮助开发者高效实现评估板视频相关功能开发与调试。

创龙,嵌入式一体化解决方案商 207

Netty4 2_ChannelInitializer

在上一篇博客中,我们看到例子中有一段代码 try { // 一个服务器助手类 ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) //用它来建立新accept的连接,用于构造serversocketchannel的工厂类

永生只是一场幻梦 6770

软考中级-软件设计师 23种设计模式(最详细解析!!)

软考中级-软件设计师 23种设计模式

片言可决讼,半纸能缚龙 2万+

netty @Sharable备注

netty和@Sharablex相关知识点的备注。 1. ChannelInitializer 当我们在serverBootstrap用childHandler去添加一个自定义ChannelInitializer如下: serverBootstrap .group(boosGroup, workerGroup) .channel(NioServerSocketChannel...

Fred's Note 832

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Netty源码分析-ChannelInitializer

ChannelInitializer是一个PPLine的初始化工具,可以往PPLine里面设置Handler。 protected abstract void initChannel(C ch) throws Exception; 我们可以重写此方法来完成初始化动作,往PPLine当中加入Handler。 .childHandler(new ChannelInitializer<S...

大新博客 1508

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

netty源码解析---bind()(2)

概述 《netty源码解析—bind()》一文的细节补充 init().addLast() 当netty获取到channel后,会向channel的pipeline 里面添加ChannelInitializer 这个handler 追溯到addLast()方法的最底层 public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) { //group=nul

kznsbs的博客 179

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

netty

1. Bootstrap and ServerBootstrap 主要作用是配置整个Netty程序,串联起各个组件。 2. EventLoopGroup and EventLoop EventLoop的目的是为Channel处理IO操作,一个EventLoop可以为多个Channel服务。 EventLoopGroup会包含多个EventLoop。 3. Channel Ch...

135

netty 通道初始化器ChannelInitializer

g/2389148[/url] netty 通道处理器上下文定义:[url]http://donald-draper.iteye.com/blog/2389214[/url] netty 通道处理器上下文:[url]http://donald-draper.iteye.com/blog/2389299[/url] [size=medium][b]引言:[/b][/size] 在前面的文章中,我们看了通道处理器,Channel管道线,和通道上下文,梳理了他们之间的关系,那么通道处理器如何添加通道的管道

Donald_Draper的专栏 2770

从零学Netty(六)Netty实现Http服务器

编写HttpServlet规范类 Servlet抽象类 /** * Servlet * * @author LionLi */ public abstract class Servlet { public abstract void doGet(Request request,Response response); public abstract void doPost(Request request,Response response); } Request相关功能.

李虹柏的博客 1730

Netty 源码分析_ChannelHandlerContext和ChannelInitializer_(4)写数据

可以看到,Channel被包装为ChannelPromise,它持有Channel和EventLoop。 在上节中介绍了ChannelPipeline,其中常用的方法是addLast(handler)将各类ChannelHandler实例添加到Channel的 ChannelPipeline中。下面我们来看addLast(handler)方法的实现: 最后调用:callHandlerAdded0 方法: 执行刚刚被添加的ChannelHander对象的handlerAdde...

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 648

netty服务端向客户端发送数据_Netty-Pipeline组件知识点

首先我们知道,在NIO网络编程模型中,IO操作直接和channel相关,比如客户端的请求连接,或者向服务端发送数据, 服务端都要从客户端的channel获取这个数据那么channelPipeline是什么?其实,这个channelPepiline是Netty增加给原生的channel的组件,在ChannelPipeline接口的上的注解阐述了channelPipeline的作用,这个channel...

weixin_39590868的博客 1643

netty(1)hello world

目录服务端1 Server解析2 childHandler参数解析3 自定义Handler二 客户端1 启动类2 ChannelInitializer3 自定义处理器 服务端 1 Server解析 public class TestServer { public static void main(String[] args) throws InterruptedException { ...

codezhuyc的博客 167

Netty

以下参考:https://blog.bywind.cn/articles/2018/11/22/1542873463672.html, 非常感谢御风大世界的文章。 里面有很多收获,迁移过来方便查看。 maven导入: <dependency> <groupId>io.netty</groupId> <artifactId>ne...

weixin_42603009的博客 301

Netty核心概念

Netty核心概念Bootstrap、ServerBootstrapFuture、ChannelFutureSelectorChannelHandlerchildHander与hander区别ChannelPipelineChannelHandlerContextEventLoopGroupEventLoopGroup Bootstrap、ServerBootstrap Future、Chann...

BorisCao的博客 304

Netty4.x源码分析

1

zxz1580977728的博客 440

netty源码分析(十三)Netty核心四大组件关系与构建方式深度解读

上一节主要看了一下ChannelHandlerContext,中间我们走到DefaultChannelPipeline的addLast方法,这一节我们从addLast方法切入: 其中group为null,name为null public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHan

wzq6578702的专栏 1003
上一篇: Netty-ChannelHandler-生命周期/顺序解读
下一篇: Java-HashMap的put()方法-源码详解
酱油瓶啤酒杯
博客等级 码龄8年 35粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值