惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

博客园 - 草木物语

Day2: Prompt Engineering 与结构化输出 - 草木物语 三招优化电脑瞬间变流畅 Hutool 的 HttpUtil.post() 方法在高并发场景下的线程安全问题 从技术大牛到管理新手:那些让你痛苦的转换期,终会成为你的铠甲 Git 提交 与 修正提交 AI的"半衰期"陷阱 越用AI我能力越差? AI时代的"认知差异陷阱" 教育在AI时代,得重新来过 AI都能写作业了,孩子还要不要学习? AI 时代,你的孩子要学会这些 java17 有什么好用的特性 vue2,vue3 父子组件交互 props,emit,slot vue3 ref()和reactive() 软件工程-第七章第七节 组织 软件工程-六 谁是解结的人 软件工程-软件工程层状模型(EHM) 软件工程-五 过程 软件工程-三 团队缺乏的不只是管理 软件工程-四 流于形式的沟通 Netty 客户端与服务端收发消息demo
Netty ChannelHandler的生命周期
草木物语 · 2024-05-22 · via 博客园 - 草木物语

ChannelHandler方法的执行是有顺序的,而这个执行顺序可以被称为ChannelHandler的生命周期。

LifeCyCleTestHandler

import io.netty.channel.ChannelInboundHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

public class LifeCyCleTestHandler extends ChannelInboundHandlerAdapter {

    // handlerAdded():指当检测到新连接之后,调用ch.pipeline().addLast(new LifeCyCleTestHandler());之后的回调,
    // 表示在当前Channel中,已经成功添加了一个Handler处理器。
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        System.out.println("逻辑处理器被添加: handlerAdded()");
        super.handlerAdded(ctx);
    }

    // channelRegistered():这个回调方法表示当前Channel的所有逻辑处理已经和某个NIO线程建立了绑定关系,
    // 接收新的连接,然后创建一个线程来处理这个连接的读写,只不过在Netty里使用了线程池的方式,只需要从线程池里去抓一个线程绑定在这个Channel上即可。
    // 这里的NIO线程通常指NioEventLoop。
    @Override
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
        System.out.println("channel绑定到线程(NioEventLoop): channelRegistered()");
        super.channelRegistered(ctx);
    }

    // channelActive():当Channel的所有业务逻辑链准备完毕(即Channel的Pipeline中已经添加完所有的Handler),
    // 以及绑定好一个NIO线程之后,这个连接才真正被激活,接下来就会回调到此方法。
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("channel准备就绪: channelActive()");
        super.channelActive(ctx);
    }

    // channelRead():客户端向服务端发送数据,每次都会回调此方法,表示有数据可读。
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("channel有数据可读: channelRead()");
        super.channelRead(ctx, msg);
    }

    // channelReadComplete():服务端每读完一次完整的数据,都回调该方法,表示数据读取完毕。
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        System.out.println("channel某次数据读完: channelReadComplete()");
        super.channelReadComplete(ctx);
    }

    // channelInactive():表面上这个连接已经被关闭了,这个连接在TCP层面已经不再是ESTABLISH状态了。
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("channel被关闭: channelInactive()");
        super.channelInactive(ctx);
    }

    // channelUnregistered():既然连接已经被关闭,那么与这个连接绑定的线程就不需要对这个连接负责了。这个回调表明与这个连接对应的NIO线程移除了对这个连接的处理。
    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
        System.out.println("channel取消线程(NioEventLoop)的绑定: channelUnregistered()");
        super.channelUnregistered(ctx);
    }

    // handlerRemoved():我们给这个连接添加的所有业务逻辑处理器都被移除。
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        System.out.println("逻辑处理器被移除: handlerRemoved()");
        super.handlerRemoved(ctx);
    }

}