Netty每次读取客户端数量有多少
发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章将为大家详细讲解有关Netty每次读取客户端数量有多少,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。当许多客户端同时连接服务端时, Netty默认每次读取多
千家信息网最后更新 2024年11月22日Netty每次读取客户端数量有多少当许多客户端同时连接服务端时, Netty默认每次读取多少连接呢? 接下来我们 就结合源码和实战分析下.
之前我们讲到NioEventLoop在进行三部曲之后(创建-启动-执行), 就会一直无限循环在执行过程. 而执行过程又分为三个步骤(轮询IO事件-处理IO事件-执行队列任务). 那么在轮询到有IO事件, 准确说当有客户端连接的事件时, 接下来就是处理IO事件, 也就是在处理IO事件的过程中, 读取客户端连接, 那么每次读取多少个呢? 说明一点, 我们使用的Netty版本如下. 因为不同的版本(尤其是最新的版本)会有差异.
当服务端一直循环在以下代码时
它会监听客户端请求. 我们假如此时通过telnet 127.0.0.1 8080连接到服务器共19个客户端.
服务器监听到ACCEPT事件后, 便会处理这些事件.
进而调用到如下主要代码
此方法内会有一个循环 我们通过debug方式调试. 为了模拟实现并发同时有19个客户端到达, 我们先在轮询IO事件地方打个断点, 让服务端线程'停止'. 当我们通过telnet执行了19个命令后再'放行'服务端线程.
断点打好之后, 我们便通过telnet 连接到服务器, 共连接19次. 连接好之后, 我们'放行'服务端线程. 我们在上面说的代码中打个断点 此时还没有读取客户端连接, 目前size = 0
当我们继续'放行'
可以看到size = 16
我们先继续'放行', 最后分析
服务器处理完上一波之后, 会再次轮询IO事件, 结果又轮询到ACCEPT事件, 继续处理IO事件. 这一次的size = 3
第一次size = 16 第二次size = 3 两个加起来正好等于我们的客户端连接数19. 于是我们猜测, 服务器每次读取客户端连接数是16. 虽然客户端同一时刻有19个客户端连接到服务器, 服务器也监听轮询到有客户端连接请求, 于是服务器在第一次循环过程只读取16个客户端. 剩下的3个客户端等到第二次轮询的时候再读取. 我们进入 查询一下.
我们可以看到有个 maxMessagePerRead属性, 它就是控制每次读取客户端数量. 我们 通过debug追踪下这个值 . 我们在如下代码中打个断点. 重启服务器 我们发现它最后被赋值16, 我们通过堆栈可以追踪到它的来源.
最后我们发现, 在创建NioServerSocketChannel的时候, 同时创建config(每个Channel对应一个Config). 每个Config对应一个RecvByteBufAllocator. 而maxMessagesPerRead属性属于 RecvByteBufAllocator类. 而那个具体的16是在哪里呢? 每个Channel都有meta
源码中可知, 将这个16赋值给了 RecvByteBufAllocator的 maxMessagesPerRead属性. 结论: 服务端每次读取16个客户端请求
这篇文章将为大家详细讲解有关Netty每次读取客户端数量有多少,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
io.netty netty-all 4.1.5.Final
io.netty.channel.nio.NioEventLoop#run
io.netty.channel.nio.NioEventLoop#processSelectedKeys
io.netty.channel.nio.AbstractNioMessageChannel.NioMessageUnsafe#read
do { int localRead = doReadMessages(readBuf); if (localRead == 0) { break; } if (localRead < 0) { closed = true; break; } allocHandle.incMessagesRead(localRead);} while (allocHandle.continueReading());
allocHandle.continueReading()
io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator.MaxMessageHandle#continueReading
public boolean continueReading() { return config.isAutoRead() && attemptedBytesRead == lastBytesRead && totalMessages < maxMessagePerRead && totalBytesRead < Integer.MAX_VALUE;}
io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator#maxMessagesPerRead(int)
关于"Netty每次读取客户端数量有多少"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
客户
客户端
服务
事件
服务器
处理
代码
断点
过程
循环
数量
同时
属性
版本
篇文章
线程
接下来
就是
时候
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器可以开多少虚拟主机
梁溪区计算机网络技术推广
云服务器支持python
计算机网络技术基础 视频
软件开发周报和月报
数据库建设工程流程
湖南互联网软件开发
深圳南湾服务器托管
苏州办公系统软件开发哪家好
数据库访问技术登录成功图片
申请网络安全审查
GBD数据库中EAPC
软件开发为啥需要本科
单招网络技术知识点
省197期网络安全小知识高中版
mysql修改数据库引擎
如何关掉数据库实例orcl
硕博论文数据库
设备软件开发咨询
数据库查询速度慢记录多
服务器带宽为什么那么低
长沙手机进销存软件开发
西安快得特网络技术有限公司
高考志愿大数据库电子表格
我的世界红石服务器免费
王者服务器为什么一直卡
苏州办公系统软件开发哪家好
网络安全自评工作
网络技术工人的稀缺性
南宁软件开发培训班