构建Netty4通道的体系化思维,这些方法你应该关注

Netty4 网络篇到目前为止即将进入收官之作,Netty4中关于事件传播机制、服务端、客户端启动流程、读、写事件的处理基本都介绍完了,本文将重点关注一下Netty 通道的其他核心API的实现逻辑,构建完备的网络通道知识体系,为深入理解NIO成为可能。

本文将以NioSocketChannel为例展示如下方法的实现细节。

boolean isWritable()

Channel read()

ChannelFuture write(Object msg)

ChannelFuture close()

1、boolean isWritable()

判断通道是否可写,其实现如下图所示:

在Netty中为了避免写缓存区无限制的写入导致内存溢出,引入了高低水位线机制,当积压数据超过设置的阔值后会设置为不可写,该方法就是判断通道是否可写。

当写缓存区中的容量超过写缓存区的高水位线时,默认为64K,则写缓存区则变为不可写,只有当写事件触发后,将写缓存区中的数据刷写到通道后,然后剩余待写字节数低于低水位线时,默认32K,则恢复可写状态。

2、Channel read()

这里看不是从网络中读取数据,而是注册读事件

根据事件传播机制,outbound事件传播机制,最终的事件处理器为HeadContext。

我们再来复习一下AbstractChannel的内部类AbstractUnsafe的beginRead方法的实现细节。

针对NIO的注册事件,Netty给出了最佳实践

首先要判断注册键(SelectionKey)是否有效。

然后通过注册键获取已注册的集合interstOps(按位表示)

通过位运算设置对应位的值,将表示读事件对应的位设置为1,表示注册读书事件。

3、ChannelFuture write(Object msg)

write是outbound事件,从tail开始传播,会经过用过定义的outbound事件处理器,例如编码器,然后最终抵达HeadContext,接下来我们重点关注HeadContext#write方法,最终会调用AbstractChannel的内部类AbstractUnsafe的write方法。

Channel的write方法,只是将数据写入到OutboundBuffer中,即放入到通道的写缓存区中。

4、ChannelFuture close()

调用该方法并不是关闭通道,而是获取一个Future,通常会注册回调事件,当通道真正被关闭时触发。

close事件类型为OutBound,从Tail开始最终会传播到HeadContext中。

其最最终具体实现在AbstractChannel的内部类AbstractUnsafe的close方法,接下来对其进行详细分析。

Step1:如果通道的待写缓存区为空,没有需要处理的数据,本次调用,只需增加***并tong;如果关闭已经完成,对本次调用,只需设置成功标识即可。

Step2:执行真正的关闭并传播相应的事件,其实现关键点:

调用doClose0关闭底层的网络通道

关闭通道的写缓存区

传播 channelInactive(非激活)事件与通道取消注册事件。

5、总结

本文主要的目的是让大家再次感受一下网络通道中其他方法的实现细节,再次体会事件传播机制,并了解各个方法的触发时机以及处理核心要点。

全部评论

相关推荐

不愿透露姓名的神秘牛友
01-15 20:52
黑皮白袜臭脚体育生:五宿大战是吧,死去的记忆还在攻击我
点赞 评论 收藏
分享
01-28 16:12
中南大学 Java
几年前还没有chatgpt的时候,刷题真的是很痛苦。刷不出来只能看题解,题解有几个问题:第一个是每次看的写题解的人都不一样,很难有一个统一的思路;第二个也是最重要的是,题解只提供了作者自己的思路,但是没有办法告诉你你的思路哪里错了。其实很少有错误的思路,我只是需要被引导到正确的思路上面去。所以传统题解学习起来非常困难,每次做不出来难受,找题解更难受。但是现在chatgpt能做很多!它可以这样帮助你 -1. 可以直接按照你喜欢的语言生成各种解法的题解和分析复杂度。2. 把题和你写的代码都发给它,它可以告诉你 你的思路到底哪里有问题。有时候我发现我和题解非常接近,只是有一点点🤏想错了。只要改这一点点就是最优解。信心倍增。3. 如果遇到不懂的题解可以一行一行询问为什么要这样写,chatgpt不会嫌你烦。有时候我觉得自己的range写错了,其实那样写也没错,只是chat老师的题解有一点优化,这个它都会讲清楚。4. 它可以帮你找可以用同类型解法来做的题。然后它可以保持解法思路不变,用一个思路爽刷一个类型的题。如果题目之间思路又有变化,它会告诉你只有哪里变了,其他的地方还是老思路。5. 它也可以直接帮你总结模板,易错点。经过chat老师的指导,我最大的改变是敢刷题了。之前刷题需要先找某一个人写的算法题repo,然后跟着某一个人他的思路刷他给的几个题。如果想写别的题,套用思路失败了,没有他的题解,也不知道到底哪里错了;看别人的题解,思路又乱了。这个问题在二分查找和dp类型的题里面特别常见。但是现在有chat老师,他会针对我的代码告诉我我哪里想错了,应该怎么做;还按照我写代码的习惯帮我总结了一套属于我的刷题模板。每天写题全是正反馈!
明天不下雨了:那我建议可以用 chatgpt atlas 或者 dia 去刷,也可以用 chrome 加个 ai 插件去刷 左边刷题右边 chat 效果很好
AI时代的工作 VS 传...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务