什么是option?

前面学习了Netty的服务端,和客户端,知道了创建服务要分别使用ServerBootStrap和BootStrap,不知道有没有关注到其中有一个方法叫做Option的?

我们分别看下ServerBootStrap和BootStrap的option:

1)ServerBootStrap

如上图所示,有两种option,一个是自己的option(ServerSocketChannel),一个childOption(ScoketChannel的option)。

2)BootStrap

只有一个option方法。

无论是上述哪两种,参数都是ChannelOption<T>,而这个ChannelOption Netty已经帮我们准备好了,可以直接使用。

参数说明

  • ChannelOption.SO_BACKLOG: 对应的是 tcp/ip 协议 listen 函数中的 backlog 参数, 在linux2.2中代表tcp已建立连接数, 而未完全建立连接/proc/sys/net/ipv4/tcp_max_syn_backlog 设置,默认值为 128. linux2.4.5之后backlog参数可以通过vim /etc/sysctl.conf 来修改,包括我们前面所说的 tcp_max_syn_backlog 也可以在此处修改,然后通过命令 sysctl -p 生效。

  • RCVBUF_ALLOCATOR: 控制 netty 接收缓冲区大小。

  • MESSAGE_SIZE_ESTIMATOR : Netty参数,消息大小估算器,默认为DefaultMessageSizeEstimator.DEFAULT。估算ByteBuf、ByteBufHolder和FileRegion的大小,其中ByteBuf和ByteBufHolder为实际大小,FileRegion估算值为0。该值估算的字节数在计算水位时使用,FileRegion为0可知FileRegion不影响高低水位。

  • ChannelOption.SO_REUSEADDR: 端口重用, 建议内网通信使用, 以防网络延迟导致报文错乱, 新程序接受到上一个延迟的数据包.

  • ChannelOption.SO_KEEPALIVE: 保持长链接,

  • ChannelOption.SO_SNDBUF: 发送缓冲区的默认大小,

  • ChannelOption.SO_RCVBUF: 接收缓冲区的默认大小.

  • ChannelOption.SO_LINGER: 阻塞linux close()关闭连接的时间,直到发送完数据再关闭.

  • ChannelOption.TCP_NODELAY: 默认false,该参数的使用与 Nagle 算法有关,Nagle 算法是将小的数据包组装为更大的帧然后进行发送,适合文件传输, 等多次write的大小达到最大,一次性发送数据,避免每次write的大小还没有默认发送缓冲区大的下数据.true为禁止

  • ChannelOption.CONNECT_TIMEOUT_MILLIS:Netty参数,连接超时毫秒数,默认值30000毫秒即30秒。用在客户端建立连接时,如果超过指定的时间仍未连接,则抛出timeout异常。

  • ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK: Netty参数,写高水位标记,默认值64KB。如果Netty的写缓冲区中的字节超过该值,Channel的isWritable()返回False。

  • ChannelOption.WRITE_BUFFER_LOW_WATER_MARK: etty参数,写低水位标记,默认值32KB。当Netty的写缓冲区中的字节超过高水位之后若下降到低水位,则Channel的isWritable()返回True。

  • ChannelOption.MAX_MESSAGES_PER_READ: Netty参数,一次Loop读取的最大消息数,对于ServerChannel或者NioByteChannel,默认值为16,其他Channel默认值为1。

  • ChannelOption.WRITE_SPIN_COUNT: Netty参数,一个Loop写操作执行的最大次数,默认值为16。也就是说,对于大数据量的写操作至多进行16次,如果16次仍没有全部写完数据,此时会提交一个新的写任务给EventLoop,任务将在下次调度继续执行。这样,其他的写请求才能被响应不会因为单个大数据量写请求而耽误。

  • ChannelOption.ALLOCATOR: Netty4使用对象池,重用缓冲区

  • AUTO_READ: Netty参数,一个连接的远端关闭时本地端是否关闭,默认值为False。值为False时,连接自动关闭;为True时,触发ChannelInboundHandler的userEventTriggered()方法,事件为ChannelInputShutdownEvent。

文章作者: 刘同学
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 刘同学的小站
后端 Java
喜欢就支持一下吧