【问题标题】:AbstractBootstrap#handler vs. ServerBootstrap#childHandler for ServerBootstrap?AbstractBootstrap#handler vs. ServerBootstrap#childHandler for ServerBootstrap?
【发布时间】:2016-09-12 05:11:56
【问题描述】:

我特别想恢复thisManish Maheshwari 的答案。记录在哪里

AbstractBootstrap 中定义的handler 用于编写基于 Netty 的客户端

在编写基于 Netty 的服务器时[使用]childHandler,如ServerBootstrap 中定义的那样。

换句话说,区别在哪里

val b = new ServerBootstrap()
b.group(boss, wrkr)
 .channel(classOf[NioServerSocketChannel])
 .handler(new LoggingHandler(LogLevel.INFO))
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 .childHandler(new ChannelInitializer[SocketChannel]() {
   override def initChannel(ch: SocketChannel): Unit =
     ch.pipeline()
       .addLast(new LoggingHandler(LogLevel.INFO))
       .addLast(new StringDecoder())
       .addLast(new StringEncoder())
 })

val b = new ServerBootstrap()
b.group(boss, wrkr)
 .channel(classOf[NioServerSocketChannel])
 .childHandler(new ChannelInitializer[SocketChannel]() {
   override def initChannel(ch: SocketChannel): Unit =
     ch.pipeline()
       .addLast(new LoggingHandler(LogLevel.INFO))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       .addLast(new StringDecoder())
       .addLast(new StringEncoder())
 })

【问题讨论】:

    标签: netty


    【解决方案1】:

    handler 频道注册一个频道处理程序
    childHandler 频道注册一个频道处理程序
    看似相同的处理程序在不同的通道上侦听事件并具有不同的行为。

    LoggingHandler 的情况下,第一个记录发生在父通道中的事件,包括端口绑定和接受新连接。因此它会生成如下日志(经过简化和注释):

    // 父频道注册
    INFO - [id: 0xb94a8e7c] REGISTERED
    // 父频道绑定到 localhost:8009
    INFO - [id: 0xb94a8e7c] BIND: 0.0.0.0/0.0.0.0:8009
    // 父通道激活
    INFO - [id: 0xb94a8e7c, L:/0:0:0:0:0:0:0:0:8009] ACTIVE
    // 父通道接受新连接,创建 id 为 0xe507ce8f 的子通道
    INFO - [id: 0xb94a8e7c, L:/0:0:0:0:0:0:0:0:8009] RECEIVED: [id: 0xe507ce8f, L:/0:0:0:0:0:0:0:1:8009 - R:/0:0:0:0:0:0:0:1:54398]

    假设子通道读取请求中的数据,您的第二个记录器将产生如下内容:

    // 子频道注册
    INFO - [id: 0x15fee362, L:/0:0:0:0:0:0:0:1:8009 - R:/0:0:0:0:0:0:0:1:55459] REGISTERED
    // 子频道激活
    INFO - [id: 0x15fee362, L:/0:0:0:0:0:0:0:1:8009 - R:/0:0:0:0:0:0:0:1:55459] ACTIVE
    // 子频道收到 7 个字节的数据,"hello\r\n"
    INFO - [id: 0x15fee362, L:/0:0:0:0:0:0:0:1:8009 - R:/0:0:0:0:0:0:0:1:55459] RECEIVED: 7B
    // 记录接收数据的十六进制转储
    +-------------------------------------------------+ | 0 1 2 3 4 5 6 7 8 9 a b c d e f | +--------+-------------------------------------------------+----------------+ |00000000| 68 65 6c 6c 6f 0d 0a |hello.. | +--------+-------------------------------------------------+----------------+

    【讨论】:

    • 这种信息在文档中应该很容易找到,可惜我们需要来SO来获取这些基本信息。
    • 记住“频道是分层的”:频道可以有父级,具体取决于它的创建方式。例如,被ServerSocketChannel 接受的SocketChannel 将返回ServerSocketChannel 作为parent() 上的父对象(来自netty.io/4.1/api/io/netty/channel/Channel.html
    猜你喜欢
    • 2013-09-30
    • 1970-01-01
    • 2016-04-14
    • 2017-05-18
    • 2021-03-08
    • 2012-10-30
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多