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

推荐订阅源

Google DeepMind News
Google DeepMind News
Stack Overflow Blog
Stack Overflow Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
T
The Blog of Author Tim Ferriss
博客园 - 叶小钗
N
Netflix TechBlog - Medium
腾讯CDC
C
Check Point Blog
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
S
SegmentFault 最新的问题
F
Fortinet All Blogs
美团技术团队
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
F
Full Disclosure
Recorded Future
Recorded Future
D
DataBreaches.Net
博客园 - 【当耐特】
Martin Fowler
Martin Fowler
J
Java Code Geeks
I
InfoQ
Y
Y Combinator Blog
A
About on SuperTechFans
AI
AI
爱范儿
爱范儿
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Forbes - Security
Forbes - Security
W
WeLiveSecurity
M
MIT News - Artificial intelligence
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
Schneier on Security
Schneier on Security
The GitHub Blog
The GitHub Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
Latest news
Latest news
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Docker
Recent Commits to openclaw:main
Recent Commits to openclaw:main
量子位
V2EX - 技术
V2EX - 技术
Project Zero
Project Zero

博客园 - 三驾马车

Claude Code 官宣:可以在 IDEA 用了! idea gitee 更新已取消 解决方案 ByteBuffer和ByteBuf区别 Marshalling.getProvidedMarshallerFactory("serial") 参数有那些 ProtobufVarint32FrameDecoder和ProtobufDecoder区别 protobuf 的 Varint 编码规范 netty initChannel ch.pipeline().addLast 先后顺序很重要 ChannelInboundHandlerAdapter 的channelRead和channelReadComplete的区别 Unpooled.buffer()和Unpooled.copiedBuffer区别 ServerBootstrap 和Bootstrap 区别 ChannelInitializer<SocketChannel> 的作用详解 ChannelHandlerAdapter 和 ChannelInboundHandlerAdapter 的区别 SimpleChannelInboundHandler 中的 messageReceived 和 channelRead0 ChannelHandlerAdapter 与 ChannelInboundHandler 的区别 Application run failed .ParserException: while parsing a block mapping in 'reader' openssl genrsa 自签名ssl证书 上传本地项目到新建git项目 save download pdf
childhandler 和 handler 区别
三驾马车 · 2025-05-14 · via 博客园 - 三驾马车

在 Netty 中,Bootstrap 和 ServerBootstrap 是用于配置客户端和服务端网络应用的核心类,它们的 handler() 和 childHandler() 方法用于设置不同的处理器,主要区别如下:


1. 适用场景

方法适用对象作用目标 Channel 类型
handler() 客户端 Bootstrap 用于设置 父 Channel 的处理器(如 NioSocketChannel
  服务端 ServerBootstrap 用于设置 服务端监听 Channel 的处理器(如 NioServerSocketChannel
childHandler() 仅服务端 ServerBootstrap 用于设置 新接受的客户端连接 Channel 的处理器(如 NioSocketChannel

2. 核心区别

(1) handler()

  • 客户端Bootstrap):
    用于配置客户端自身的处理器(如编解码器、日志、业务逻辑等)。

    Bootstrap b = new Bootstrap();
    b.handler(new ChannelInitializer<SocketChannel>() {
        @Override
        protected void initChannel(SocketChannel ch) {
            ch.pipeline().addLast(new MyClientHandler());
        }
    });
  • 服务端ServerBootstrap):
    用于配置服务端监听端口的处理器(如监控服务器状态、记录连接数等),一般不处理具体业务

    ServerBootstrap b = new ServerBootstrap();
    b.handler(new LoggingHandler(LogLevel.INFO)); 

(2) childHandler()

  • 仅服务端ServerBootstrap):
    用于配置每个新接受的客户端连接的处理器(如编解码器、身份验证、业务逻辑等)。

    ServerBootstrap b = new ServerBootstrap();
    b.childHandler(new ChannelInitializer<SocketChannel>() {
        @Override
        protected void initChannel(SocketChannel ch) {
            ch.pipeline()
                .addLast(new StringDecoder())
                .addLast(new StringEncoder())
                .addLast(new MyServerHandler());
        }
    });

3. 执行流程对比

NioSocketChannelNioServerSocketChannel服务端客户端NioSocketChannelNioServerSocketChannel服务端客户端发起连接监听端口(handler()生效)创建新连接(childHandler()生效)通信


4. 关键注意事项

  1. 客户端没有 childHandler
    因为客户端只需管理自己的单一连接,直接使用 handler()

  2. 服务端必须区分两者

    • handler() 影响服务端自身的监听行为(如记录连接事件)。

    • childHandler() 影响每个客户端连接的处理逻辑(如业务处理)。

  3. 典型配置示例

    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
     .channel(NioServerSocketChannel.class)
     .handler(new LoggingHandler()) 

5. 常见问题

  • 混淆使用:在服务端误将业务处理器加到 handler() 而非 childHandler(),导致无法处理客户端数据。

  • 性能影响handler() 中的处理器会共享于所有客户端连接,需确保线程安全(如添加 @Sharable 注解)。


总结

  • handler():配置“父级”Channel(客户端自身/服务端监听端口)。

  • childHandler():配置服务端接受的“子级”客户端连接。

  • 记忆技巧:服务端像“父亲”,用 handler() 管自己,用 childHandler() 管“孩子”(客户端连接)。