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

推荐订阅源

美团技术团队
D
DataBreaches.Net
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
Docker
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
Check Point Blog
腾讯CDC
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
IT之家
IT之家
月光博客
月光博客
U
Unit 42
K
Kaspersky official blog
T
Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
云风的 BLOG
云风的 BLOG
酷 壳 – CoolShell
酷 壳 – CoolShell
I
InfoQ
Engineering at Meta
Engineering at Meta
Recorded Future
Recorded Future
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Security @ Cisco Blogs
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
Schneier on Security
S
Secure Thoughts
The Register - Security
The Register - Security
B
Blog RSS Feed
The Last Watchdog
The Last Watchdog
P
Palo Alto Networks Blog
爱范儿
爱范儿
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News and Events Feed by Topic
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 热门话题
C
Cisco Blogs
Spread Privacy
Spread Privacy
F
Full Disclosure
博客园 - 聂微东
T
The Blog of Author Tim Ferriss

博客园 - 三驾马车

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() 管“孩子”(客户端连接)。