当许多客户端同时连接服务端时, Netty默认每次读取多少连接呢? 接下来我们 就结合源码和实战分析下.

在前面的文章我们讲到NioEventLoop在进行三部曲之后(创建-启动-执行), 就会一直无限循环在执行过程. 而执行过程又分为三个步骤(轮询IO事件-处理IO事件-执行队列任务). 那么在轮询到有IO事件, 准确说当有客户端连接的事件时, 接下来就是处理IO事件, 也就是在处理IO事件的过程中, 读取客户端连接, 那么每次读取多少个呢?

说明一点, 我们使用的Netty版本如下. 因为不同的版本(尤其是最新的版本)会有差异.

<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.5.Final</version>
</dependency>

当服务端一直循环在以下代码时

io.netty.channel.nio.NioEventLoop#run

它会监听客户端请求. 我们假如此时通过telnet 127.0.0.1 8080连接到服务器共19个客户端.

服务器监听到ACCEPT事件后, 便会处理这些事件.

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());

我们通过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个客户端等到第二次轮询的时候再读取. 我们进入

allocHandle.continueReading()

查询一下.

io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator.MaxMessageHandle#continueReading
public boolean continueReading() {return config.isAutoRead() &&attemptedBytesRead == lastBytesRead &&totalMessages < maxMessagePerRead &&totalBytesRead < Integer.MAX_VALUE;
}

我们可以看到有个maxMessagePerRead属性, 它就是控制每次读取客户端数量. 我们通过debug追踪下这个值. 我们在如下代码中打个断点.

io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator#maxMessagesPerRead(int)

重启服务器

我们发现它最后被赋值16, 我们通过堆栈可以追踪到它的来源.

最后我们发现, 在创建NioServerSocketChannel的时候, 同时创建config(每个Channel对应一个Config). 每个Config对应一个RecvByteBufAllocator. 而maxMessagesPerRead属性属于RecvByteBufAllocator类. 而那个具体的16是在哪里呢?

每个Channel都有meta

源码中可知, 将这个16赋值给了RecvByteBufAllocator的maxMessagesPerRead属性.

结论: 服务端每次读取16个客户端请求

iss版本服务器读取_Netty每次读取客户端数量相关推荐

  1. iss版本服务器读取_【IIS7服务器管理工具下载】IIS7服务器管理 v2.1.9 官方版-开心电玩...

    软件介绍 IIS7服务器管理工具是一款可以在多种操作系统上使用的批量管理工具,我们可以通过这款软件来同时管理多个IIS7服务器.而且你还可以对这些服务器进行批量管理.操作同步.到期提醒等多种操作,从而 ...

  2. SVN版本服务器搭建(服务端+客户端)

     http://www.cnblogs.com/warrior1988/p/5359084.html 环境:Win7 32 bit SVN简介:程序员在编写程序的过程中,每个程序员都会生成很多不同 ...

  3. python从云端服务器读数据_audio 读取服务器文件

    PHP面试干货 1.进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性.进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一 ...

  4. Arduino ESP32 Web服务器从microSD卡读取

    Arduino ESP32 Web服务器从microSD卡读取 将网页内容放到SD卡中,当有客户端数据请求时,从SD卡读取信息进行发送,比起SPIFFS文件系统,更节约板上的硬件资源. SD卡接线说明 ...

  5. 【分布式版本控制系统】GIT 托管网站 客户端

    上传到远程库 第一次上传 git add . git commit -m"备注信息" 之后上传 git add . git commit -m"备注信息" gi ...

  6. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...

  7. python读取文件-python读取大文件

    最近在学习python的过程中接触到了python对文件的读取.python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.rea ...

  8. 服务器推送信息到客户端,服务器如何发送消息到客户端

    服务器如何发送消息到客户端 内容精选 换一换 使用SSH方式登录CentOS 6.5操作系统的弹性云服务器时,过一段时间就会自动断开连接.本节操作介绍如何保持SSH会话持续连接不断开该文档适用于Cen ...

  9. html复选框读取数据库,checkbox 读取数据库

    JS弄ASP.NET(C#)在页GridView信息选择行 ${textbanner3.replace("\n","")} 文章 eddie小英俊 2017-1 ...

最新文章

  1. 人工智能灵魂注入,燃烧你的卡路里——2018,你AI了吗!?
  2. 矮个男生不好找对象?某大厂程序员自称太高也难找对象!身高196cm,有房有车,却被嫌太高!...
  3. Excel打开csv文件显示乱码问题解决方法
  4. linux c设置系统时间函数,Linux C 中获取local日期和时间 time()localtime()函数
  5. Python nose测试工具报ImportError: No Module named 错误
  6. GJB-150湿热试验,国军标150试验机构
  7. 类和结构体的内存空间占有问题
  8. 用SQL分析北京周边城市:天津以及保定房价
  9. hadoop清理回收站
  10. 分析java程序在运行中卡顿
  11. 母婴网站Zulily盈余隐秘竟然是推延发货?
  12. 2020智能交通展新发展方向“5G+智能交通”共赢未来 值得期待
  13. java jtable用法_Java中JTable的用法
  14. Windows Linux 实用技巧
  15. 基于Shape From Shading(SFS)原理的侧扫声呐海底三维重建项目进度记录
  16. 单片机外围电路设计之六:场效应管
  17. Oracle项目管理系统之会议闭环管理
  18. kettle遍历抽取某目录下Excel文件数据
  19. Shiro验证策略-shiro自定义实现Realm来实现身份验证-shiro散列加密算法-shiro授权-shiro自定义Realm实现授权
  20. Sony IMX118sensor驱动与视频数据处理

热门文章

  1. java自定义表单_JSP实现用于自动生成表单标签html代码的自定义表单标签
  2. mysql之为已经建好的表格添加id为自增主键
  3. MATLAB基础学习笔记02:掌握MATLAB运算
  4. Spring Boot基础学习笔记19:自定义RedisTemplate与RedisCacheManager
  5. 大数据学习笔记42:Hive - 分桶表
  6. 伪元素before、after示例
  7. 【codevs4654】【BZOJ2442】修剪草坪,第一次的单调队列,优化DP
  8. linux c 文件拷贝函数,Linux C函数库参考手册
  9. vb mysql边记录边统计_vb6 数据库 增加记录
  10. mysql中phpmyadmin安装教程_phpMyAdmin 安装教程全攻略