Netty源码剖析-断开连接

摘要:
当读取的字节数为-1时,意味着当数据读取关闭时,将强制关闭,触发IOException,然后执行通道关闭,包括取消SelectKey。我只是想做得更好,仅此而已。

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

----主线:

Netty源码剖析-断开连接第1张

----源码:

    在NioEventLoop的unsafe.read()打断点

Netty源码剖析-断开连接第2张

 在客户端关闭的地方也加个断点,并且修改点代码:

Netty源码剖析-断开连接第3张

 然后启动server和client;就会发现代码停在关闭的地方:

Netty源码剖析-断开连接第4张

当下一步的时候,则会来到最开始的断点:

Netty源码剖析-断开连接第5张

 这个时候的unsafe就是NioSocketChannel,继续跟进并在下图的“doReadBytes()”打个断点:

Netty源码剖析-断开连接第6张

 继续跟进:

Netty源码剖析-断开连接第7张

 再进入writeBytes():

 Netty源码剖析-断开连接第8张

这个时候writtenBytes=-1, -1表示正常关闭,然后返回-1;接着回去

Netty源码剖析-断开连接第9张

进入closeOnRead();

Netty源码剖析-断开连接第10张

 再进入close();一直跟进后:

Netty源码剖析-断开连接第11张

 这里this.outboundBuffer=nul;表示不接受消息,接着往下走有个doClose0();

Netty源码剖析-断开连接第12张

一直跟进去,直到看到javaChannel.close();

Netty源码剖析-断开连接第13张

 这个其实就是调用jdk:

Netty源码剖析-断开连接第14张

 再继续跟进:

Netty源码剖析-断开连接第15张

 就是将SelectionKey从Selector上cancel掉,这样的话这个Selector上就不会发生这个Channel的event了!接着返回

Netty源码剖析-断开连接第16张

 一直跟进:

Netty源码剖析-断开连接第17张

 点进去不妨可以看出:

  Netty源码剖析-断开连接第18张

 它也做了一次cancel;

Netty源码剖析-断开连接第19张

 跳转回来一次正常的关闭就结束了

Netty源码剖析-断开连接第20张

----总结:

    连接关闭本质:

     java.nio.channels.spi.AbstractInterruptibleChannel#close;

      java.nio.channels.SelectionKey#cancel

    关闭连接,会触发OP_READ方法。读取字节数是-1代表关闭

    数据读取进行时,强行关闭,触发IO Exception,进而执行关闭

    Channel的关闭包含了SelectKey的cancel.

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

免责声明:文章转载自《Netty源码剖析-断开连接》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android把自己应用加入到系统文件分享中如何在Android应用中加入广告下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

chromium浏览器开发系列第三篇:chromium源码目录结构

上两篇介绍了下载源码和编译源码,这次主要介绍chromium的源码目录结构,我也是通过源码和官网结合来跟大家说,如果有说的不准确的,欢迎交流。 另外,官网的不一定准确,他们其实也很懒,所以最主要还是靠自己。官网只能作为一个参考。 Chromium结构相对两年前变化很大。目录结构依然很清晰,主要有三个部分(不包括其他的库):浏览器,渲染器,webkit。浏览...

14.深入k8s:kube-proxy ipvs及其源码分析

转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 这一篇是讲service,但是基础使用以及基本概念由于官方实在是写的比较完整了,我没有必要复述一遍,所以还不太清楚的小伙伴们可以去看官方的文档:https://kubernetes.io/docs/concepts/se...

【精品】Android游戏类源码大集合

Android自定义效果——随机抽奖 一个模拟抽奖的效果,用户设定若干个选项,添加之后,就可以通过程序,来帮助随机选择其中一项出来。这个类似超市里面那种指针转盘抽奖,run之后是一个动态效果图,初始快速转动,最后慢慢停在某个选项上。 下载地址:点击下载 游戏2048 仿游戏2048,能达到预期效果,并很好的实现完的感觉。 下载地址:点击下载 运行效果图...

【转】C++调试技巧

自己总是用VC平台来开发东西,但是有时候总是出这样那样的问题,在这里把Visual C++开发工具与调试技巧整理摘录如下,希望对大家有用,省去大家再去搜索的烦恼。   1.如何在Release状态下进行调试   Project->Setting=>ProjectSetting对话框,选择Release状态。C/C++标签中的Category选G...

优秀开源项目的svn地址

很多优秀的开源项目已经提供SVN源码签出了,无论是解疑还是学习,都是一大幸福之事啊! Apache的SVN库,强烈推荐! http://svn.apache.org/repos/asf/  里面不但有Struts的源码,还有著名的Apache jakarta project 相当好的Web UI框架Tiles 现在很流行的项目管理工具Maven Ant、C...

Windows下 VS2015编译RocksDB

VS2015编译RocksDB RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key-value 存储系统,也可作为 C/S 模式下的存储数据库,但主要目的还是嵌入式。RocksDB 基于 LevelDB 构建。 1、下载rocksdb源码 git clone https://github.com/facebook/rocksdb...