关于Netty配置的ServerBootstrap.option()和ServerBootstrap.childOption()

Eave 2025.08.05

option主要是针对boss线程组,child主要是针对worker线程组

1、option/handler/attr方法

option: 设置通道的选项参数,对于服务端而言就是ServerSocketChannel,客户端而言就是SocketChannel;

handler: 设置主通道的处理器,对于服务端而言就是ServerSocketChannel,也就是用来处理Acceptor的操作;对于客户端的SocketChannel,主要是用来处理业务操作;

attr: 设置通道的属性;

option/handler/attr方法都定义在AbstractBootstrap中, 所以服务端和客户端的引导类方法调用都是调用的父类的对应方法。

2、childHandler/childOption/childAttr方法(只有服务端ServerBootstrap才有child类型的方法)

对于服务端而言,有两种通道需要处理,一种是ServerSocketChannel:用于处理用户连接的accept操作, 另一种是SocketChannel,表示对应客户端连接。而对于客户端,一般都只有一种channel,也就是SocketChannel。

因此以child开头的方法,都定义在ServerBootstrap中,表示处理或配置服务端接收到的对应客户端连接的SocketChannel通道。

3、服务端由两种线程池,用于Acceptor的React主线程和用于I/O操作的React从线程池; 客户端只有用于连接及IO操作的React的主线程池;

4、ServerBootstrap中定义了服务端React的"从线程池"对应的相关配置,都是以child开头的属性。 而用于"主线程池"channel的属性都定义在AbstractBootstrap中;

channelOption含义

ChannelOption.SO_BACKLOG:用于设置TCP套接字的连接队列大小。指定等待接受的连接的最大数量。

ChanneOption.SO_REUSEADDR: 对应于套接字选项中的SO_REUSEADDR,这个参数表示允许重复使用本地地址和端口,比如,某个服务器进程占用了TCP的80端口进行监听,此时再次监听该端口就会返回错误,使用该参数就可以解决问题,该参数允许共用该端口,这个在服务器程序中比较常使用,比如某个进程非正常退出,该程序占用的端口可能要被占用一段时间才能允许其他进程使用,而且程序死掉以后,内核一需要一定的时间才能够释放此端口,不设置SO_REUSEADDR就无法正常使用该端口。

Channeloption.SO_KEEPALIVE: 用于启用或禁用TCP的KeepAlive机制。当设置为true时,TCP会定期发送KeepAlive探测包,用于检测连接是否仍然有效,一般是两小时。

ChannelOption.SO_SNDBUFChannelOption.SO_RCVBUF: 参数对应于套接字选项中的SO_SNDBUFChannelOption.SO_RCVBUF参数对应于套接字选项中的SO_RCVBUF这两个参数用于操作接收缓冲区和发送缓冲区的大小,接收缓冲区用于保存网络协议站内收到的数据,直到应用程序读取成功,发送缓冲区用于保存发送数据,直到发送成功。

ChannelOption.SO_LINGER: 参数对应于套接字选项中的SO_LINGER,Linux内核默认的处理方式是当用户调用close()方法的时候,函数返回,在可能的情况下,尽量发送数据,不一定保证会发生剩余的数据,造成了数据的不确定性,使用SO_LINGER可以阻塞close()的调用时间,直到数据完全发送

ChannelOption.TCP_NODELAY: 控制是否启用Nagle算法。Nagle算法通过将小的数据块组合成更大的数据块来减少网络传输,从而提高效率。当设置为true时,禁用Nagle算法,即使用小的数据块发送数据。

ChannelOption.SO_TIMEOUT: 设置Socket的超时时间。用于设置读取或写入操作的超时时间。

ChannelOption.ALLOCATOR: 设置ByteBuf的分配器。可以配置为PooledByteBufAllocator.DEFAULT以启用内存池。