Netty AbstractBootstrap#handler与ServerBootstrap#用于ServerBootstrap的childHandler?

Netty AbstractBootstrap#handler与ServerBootstrap#用于ServerBootstrap的childHandler?,netty,Netty,特别是,我想重申一下一个和另一个的答案。哪里有文件证明 处理程序,在抽象引导中定义,用于编写基于Netty的客户端 及 编写基于Netty的服务器时[使用]childHandler,如ServerBootstrap中所定义 换句话说,两者的区别在哪里 val b=new ServerBootstrap() b、 组(boss,wrkr) .channel(类[NioServerSocketChannel]) .handler(新的LoggingHandler(LogLevel.INFO)) ^^

特别是,我想重申一下一个和另一个的答案。哪里有文件证明

处理程序
,在
抽象引导
中定义,用于编写基于Netty的客户端

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

换句话说,两者的区别在哪里

val b=new ServerBootstrap()
b、 组(boss,wrkr)
.channel(类[NioServerSocketChannel])
.handler(新的LoggingHandler(LogLevel.INFO))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.childHandler(新通道初始值设定项[SocketChannel](){
覆盖def初始通道(通道:SocketChannel):单位=
ch.管道()
.addLast(新的LoggingHandler(LogLevel.INFO))
.addLast(新的StringDecoder())
.addLast(新的StringEncoder())
})

val b=new ServerBootstrap()
b、 组(boss,wrkr)
.channel(类[NioServerSocketChannel])
.childHandler(新通道初始值设定项[SocketChannel](){
覆盖def初始通道(通道:SocketChannel):单位=
ch.管道()
.addLast(新的LoggingHandler(LogLevel.INFO))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.addLast(新的StringDecoder())
.addLast(新的StringEncoder())
})

处理程序
父通道注册通道处理程序
childHandler
child频道注册频道处理程序
看似相同的处理程序在不同的通道上侦听事件,并具有不同的行为

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

//父频道已注册
INFO-[id:0xb94a8e7c]已注册
//父频道绑定到本地主机:8009
INFO-[id:0xb94a8e7c]绑定:0.0.0.0/0.0.0:8009

//父频道处于活动状态
INFO-[id:0xb94a8e7c,L:/0:0:0:0:0:0:0:8009]处于活动状态
//父通道接受新连接,创建id为0xe507ce8f的子通道
INFO-[id:0xb94a8e7c,L:/0:0:0:0:0:0:0:0:0:8009]收到:[id:0xe507ce8f,L:/0:0:0:0:0:0:1:8009-R:/0:0:0:0:0:0:1:54398]

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

//已注册子频道
INFO-[id:0x15fee362,L:/0:0:0:0:0:1:8009-R:/0:0:0:0:0:0:0:1:55459]已注册
//子频道处于活动状态
INFO-[id:0x15fee362,L:/0:0:0:0:0:1:8009-R:/0:0:0:0:0:0:0:1:55459]处于活动状态
//子通道接收到7字节的数据,“hello\r\n”
INFO-[id:0x15fee362,L:/0:0:0:0:0:1:8009-R:/0:0:0:0:0:0:0:1:55459]收到:7B

//记录接收数据的十六进制转储

+-------------------------------------------------+
|01 2 3 4 5 6 7 8 9 a b c d e f|
+--------+-------------------------------------------------+----------------+
|00000000 | 68 65 6c 6c 6f 0d 0a |你好|
+--------+-------------------------------------------------+----------------+


这类信息应该很容易在文档中找到,但遗憾的是,我们需要这么做才能获得这样的基本信息。请记住“通道是分层的”:一个通道可以有一个父级,这取决于它是如何创建的。例如,
ServerSocketChannel
接受的
SocketChannel
,将返回
ServerSocketChannel
作为其在
parent()
上的父对象(从)