参考文献:极客时间傅健老师的《Netty源码剖析与实战》Talk is cheap.show me the code!

----主线:worker thread

  ①多路复用器(Selector)接受到OP_READ事件

  ②处理OP_READ事件:NioSocketChannel.NioSocketChannelUnsafe.read();

    -1分配一个初始1024字节的byte buffer来接受数据

    -2从Channel接受数据到byte buffer

    -3记录实际接受数据大小,调整下次分配byte buffer大小

    -4触发pipeline.fireChannelRead(byteBuf)把读取到的数据传播出去

    -5判断接受byte buffer是否满载而归,是:尝试继续读取直到没有数据或满16次,否:结束本轮读取,等待下次OP_READ事件

----源码解释:

    在NioEventLoop中的processSelectedKey()的unsafe.read()加个断点

然后启动服务端和客户端...第一次启动的时候如下图:

这里的channel=NioServerSocketChannel.处理的是OP_ACCEPT,我们直接放行,断点还停留在原地看看效果:

可以清楚的看到这时候的channel=NioSocketChannel;这个时候我们跟进去看看:

进入read()方法后可以看到这行代码,byteBuf = allocHandle.allocate(allocator);表示尽可能分配合适的大小:“guess”;下面一行“allocHandle.lastBytesRead(doReadBytes(byteBuf));”则表示读并且记录读了多少,如果读满了下次继续的话直接扩容;先跟进看看allocate();

然后在进去guess();

进来可以发现返回的是“1024”,接着往下走:

进入doReadBytes();

可以发现这里有一个“byteBuf.writeBytes()”;接着跟进去看看:

再跟进"setBytes()"

这里就能看出来是“SocketChannel.read()”;然后再接着往下执行返回:

不难看出读取了一次:

下面的pipeline.fireChannelRead(byteBuf);则是处理业务逻辑的地方,pipeline上执行,继续往下走:

allocHandle.readComplete();记录这次读事件共读了多少数据,计算下次分配的大小

pipeline.fireChannelReadComplete();相当于完成本次读事件的处理

----总结:

  读取数据的本质:sun.nio.ch.SocketChannelImpl#read(java.nio.ByteBuffer)

  NioSocketChannel read()是读数据,NioServerSocketChannel read()是创建连接

  pipeline.fireChannelReadComplete();表示一次事件处理完成

    pipeline.fireChannelRead(byreBuf);一次读取数据完成,一次读事件处理可能会包含多次读数据操作

  为什么最多只尝试读取16次?“雨露均沾”

  AdaptiveRecvByteBufAllocator对bytebuf的猜测:放大果断,缩小谨慎(需要连续两次判断)

我只想做的更好,仅此而已。

Netty源码剖析-接受数据的更多相关文章

  1. Netty源码剖析-发送数据

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 开始之前先介绍下Netty写数据的三种方式: ①:write:写到一 ...

  2. Netty源码剖析-断开连接

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: ----源码: 在NioEventLoop的unsa ...

  3. Netty 源码剖析之 unSafe.write 方法

    前言 在 Netty 源码剖析之 unSafe.read 方法 一文中,我们研究了 read 方法的实现,这是读取内容到容器,再看看 Netty 是如何将内容从容器输出 Channel 的吧. 1. ...

  4. Netty源码剖析-业务处理

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:worker thread 触发pipeline.fi ...

  5. Netty源码剖析-构建链接

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: 和启动一样也是有两个线程完成的,boss threa ...

  6. Netty源码剖析-启动服务

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...

  7. Netty源码剖析-关闭服务

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:  ----源码: 先在服务端加个断点和修改下代码:如 ...

  8. Netty学习笔记(三)——netty源码剖析

    1.Netty启动源码剖析 启动类: public class NettyNioServer { public static void main(String[] args) throws Excep ...

  9. Netty 源码剖析之 unSafe.read 方法

    目录: NioSocketChannel$NioSocketChannelUnsafe 的 read 方法 首先看 ByteBufAllocator 再看 RecvByteBufAllocator.H ...

随机推荐

  1. MySQl的库操作、表操作和数据操作

    一.库操作 1.1库的增删改查 (1)系统数据库: performance_schema:用来收集数据库服务器的性能参数,记录处理查询时发生的各种事件.锁等现象 mysql:授权库,主要存储系统用户的 ...

  2. 玩转orangpi 之frpc远程管理+pcd8544(nokia5110 屏幕) 显示运行状态

    玩转orangpi 之frpc远程管理+pcd8544(nokia5110 lcd) 显示运行状态. 物件: orangepi一套(电源,网线,orangepiPC)110元 nokia 5110 l ...

  3. 和证书相关的文件格式: Pem, Pfx, Der

    Pem Pem是最常见的证书文件格式.常见文件扩展名为.pem. 其文件内容采用如下格式: -----BEGIN CERTIFICATE----- Base64编码的证书内容-----END CERT ...

  4. ZR#996

    ZR#996 解法: 若删除长度为 $ x $ 的子串后序列中没有相同元素,那么一定有至少一个长度为 $ x+1 $ 的子串,删除它后序列中也没有相同元素. CODE: #include <io ...

  5. chrome jssip

    WebRTC 实现了基于网页的视频会议,标准是WHATWG 协议,目的是通过浏览器提供简单的javascript就可以达到实时通讯(Real-Time Communications (RTC))能力 ...

  6. 黑马vue---37-38、vue实例的生命周期

    黑马vue---37-38.vue实例的生命周期 一.总结 一句话总结: created:实例已经在内存中创建OK,此时 data 和 methods 已经创建OK,此时还没有开始 编译模板 moun ...

  7. ArcGIS超级工具SPTOOLS-锐角检查,获得内角并判断是否凸多边形,获得线(面)两个折点方向

    1.1  锐角检查 操作视频: https://weibo.com/tv/v/HCNNXhm5F?fid=1034:4392479009475111 可以是面.线夹角锐角检查 输出锐角点的位置和角度( ...

  8. 查看memcache版本

    window: cmd中用telnet 127.0.0.1 11211这样的命令连接上memcache,然后直接输入stats就可以得到memcache服务器的版本. 注意:memcache的默认端口 ...

  9. maven打包遇到错误,Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test

    对Pom文件进行配置(亲自尝试,已成功解决) <build> <plugins> <plugin> <groupId>org.apache.maven. ...

  10. [js]vue小结

    vue基础 - vue是一个渐进式框架 vue (视图渲染) components(路由机制) vue-router(路由管理) vuex (状态管理) vuecli (构建工具) - 库和框架 库如 ...