Netty4 Channel 概述

2、Channel常用API


Channel 类图结构如下:

在这里插入图片描述

核心API一览:

  • EventLoop eventLoop()

返回该通道注册的事件轮询器。

  • Channel parent()

返回该通道的父通道,如果是ServerSocketChannel实例则返回null,SocketChannel实例则返回对应的ServerSocketChannel。

  • ChannelConfig config()

返回该通道的配置参数。

  • boolean isOpen()

端口是否处于open,通道默认一创建isOpen方法就会返回true,close方法被调用后该方法返回false。

  • boolean isRegistered()

是否已注册到EventLoop。

  • public boolean isActive()

通道是否处于激活。NioSocketChannel的实现是java.nio.channels.SocketChannel实例的isOpen()与isConnected()都返回true。NioServerSocketChannel的实现是ServerSocketChannel.socket().isBound(),如果绑定到端口中,意味着处于激活状态。

  • ChannelFuture closeFuture()

Future模式的应用,调用该方法的目的并不是关闭通道,而是预先创建一个凭证(Future),等通道关闭时,会通知该Future,用户可以通过该Future注册事件。

  • ChannelFuture bind(SocketAddress localAddress)

Netty服务端绑定到本地端口,开始监听客户端的连接请求。该过程会触发事件链(ChannelPipeline)。该部分将在后续讲解服务端启动流程时再详细分析。

  • ChannelFuture connect(SocketAddress remoteAddress)

Netty客户端连接到服务端,该过程同样会触发一系列事件(ChannelPipeline)。该部分将在后续讲解客户端启动流程时再详细分析。

  • ChannelFuture disconnect()

断开连接,但不会释放资源,该通道还可以再通过connect重新与服务器建立连接。

  • ChannelFuture close()

关闭通道,回收资源,该通道的生命周期完全结束。

  • ChannelFuture deregister()

取消注册。

  • Channel read()

通道读,该方法并不是直接从读写缓存区读取文件,而是向NIO Selecor注册读事件(目前主要基于NIO)。当通道收到对端的数后,事件选择器会处理读事件,从而触发ChannelInboundHandler#channelRead 事件,然后继续触发ChannelInboundHandler#channelReadComplete(ChannelHandlerContext)事件。

  • ChannelFuture write(Object msg)

向通道写字节流,会触发响应的写事件链,该方法只是会将字节流写入到通道缓存区,并不会调用flush方法写入通道中。

  • Channel flush()

刷写所有挂起的消息(刷写到流中)。

  • ChannelFuture writeAndFlush(Object msg)

相当于调用write与flush方法。

3、Channel配置与选项


3.1 Channel配置

ChannelConfig 的类图如下:

在这里插入图片描述

核心配置如下:

  • Map<ChannelOption<?>, Object> options:选项,在下文会重点介绍。

  • int connectTimeoutMillis:连接超时时间。

  • int maxMessagesPerRead:每次读事件中调用读方法的最大次数(AbstractNioByteChannel)或读事件循环中最多处理的消息条数(AbstractNioMessageChannel)。

  • int writeSpinCount:一次写事件处理期间最多调用write方法的次数,引入该机制主要是为了避免一个网络通道写入大量数据,对其他网络通道的读写处理带来延迟,默认值为16。

  • ByteBufAllocator getAllocator():返回该通道的内存分配器(ByteBuf)。

RecvByteBufAllocator getRecvByteBufAllocator():读事件读缓冲区的分配策略。

  • boolean autoRead:是否自动触发read方法调用,默认为true,读事件触发后自动调用read方法 ,而无需应用程序显示调用。

  • int writeBufferHighWaterMark:设置写缓存区的高水位线。如果写缓存区中的数据超过该值,Channel#isWritable()方法将返回false。

  • int writeBufferLowWaterMark:设置写缓存区的低水位线。如果写缓存区的数据超过高水位线后,通道将变得不可写,等写缓存数据降低到低水位线后通道恢复可写状态(Channel#isWritable()将再次返回true)。

3.2 ChannelOption

在这里插入图片描述

网络通道(Channel)选项值,下面介绍一下与TCP协议相关的核心参数:

  • SO_BROADCAST

选择值类型:boolean。表值该数据包是否是广播包,true表示广播包,false表示非广播,如果包的IP地址为广播地址,但该选型为false,则在内核层会抛出错误。

  • SO_KEEPALIVE

对于面向连接的TCP socket,在实际应用中通常都要检测对端是否处于连接中,连接端口分两种情况:

  • 连接正常关闭,调用close() shutdown()连接优雅关闭,send与recv立马返回错误,select返回SOCK_ERR

  • 连接的对端异常关闭,比如网络断掉,突然断电.

  • SO_SNDBUF的大小

为了达到最大网络吞吐,socket send buffer size(SO_SNDBUF)不应该小于带宽和延迟的乘积。

  • SO_REUSEADDR

该参数如果设置为true的一个常用应用场景是端口复用(直接复用TIME_WAIT状态的socket)。

  • SO_LINGER

该参数是控制TCP关闭行为的。

  • SO_BACKLOG

服务端接受客户端连接的处理队列,在TCP三次握手协议中,服务端接收到客户端的SYN包后,会向客户端发送SYN+ACK包,同时会将连接放入到 backlog 队列中,等待客户端ACK包。在服务端没有接收到客户端的ACK包之前,连接会暂存 backlog 队列。

  • SO_TIMEOUT

以毫秒为单位定义套接字超时(SO_TIMEOUT),它是等待数据的超时,或者换句话说,是两个连续数据包之间的最大活动周期。超时值为0将被解释为无限超时。如果没有设置该参数,读取操作将不会超时(无穷小超时)。个人思考:在NIO编程开发中应该不要设置该值,但为了保证每个连接的读平等,Netty会控制一次事件选择周期,最多可调用read方法的次数。

  • TCP_NODELAY

在TCP数据包发送的时候,有一种算法(Nagle算法)。该算法的核心是如果发生数据包比较小,为了提高带宽的利用率,会等待更多的数据到达后再发送或等待超时后将小包发送,也就是TCP发送延迟,TCP_NODELAY=true表示不使用tcp delay延迟,故禁用Nagle算法。通常接受端的ACK包也会使用延迟(默认40ms),旨在合并多个ACK确认包。

Nagle 算法的改进在于:如果发送端欲多次发送包含少量字符的数据包(一般情况下,后面统一称长度小于MSS的数据包为小包,与此相对,称长度等于MSS的数据包为大包,为了某些对比说明,还有中包,即长度比小包长,但又不足一个MSS的包;MSS,TCP最大分段大小,以太网下一般就是1460字节。),则发送端会先将第一个小包发送出去,而将后面到达的少量字符数据都缓存起来而不立即发送,直到收到接收端对前一个数据包报文段的ACK确认、或当前字符属于紧急数据,或者积攒到了一定数量的数据(比如缓存的字符数据已经达到数据包报文段的最大长度)等多种情况才将其组成一个较大的数据包发送出去。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值