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

----主线:

----源码:

    在NioEventLoop的unsafe.read()打断点

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

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

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

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

继续跟进:

再进入writeBytes():

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

进入closeOnRead();

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

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

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

这个其实就是调用jdk:

再继续跟进:

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

一直跟进:

点进去不妨可以看出:

  

它也做了一次cancel;

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

----总结:

    连接关闭本质:

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

      java.nio.channels.SelectionKey#cancel

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

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

    Channel的关闭包含了SelectKey的cancel.

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

Netty源码剖析-断开连接的更多相关文章

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

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

  2. Netty源码剖析-接受数据

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:worker thread ①多路复用器(Select ...

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

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

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

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

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

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

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

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

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

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

  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. ERROR: node with name "rabbit" already running on "localhost"

    rabbitmqctl start_app启动没有这个问题

  2. Linux常用命令大全(最完整)

    要学习Linux语法最好到专门的网站 常用语法大全:https://www.runoob.com/linux/linux-command-manual.html (菜鸟教程) 另外提供一个总结的不错的 ...

  3. [提权]CVE-2018-8120漏洞复现

    0x01 漏洞名称 Windows操作系统Win32k的内核提权漏洞 0x02 漏洞编号 CVE-2018-8120 0x03 漏洞描述 部分版本Windows系统win32k.sys组件的NtUse ...

  4. TripleDES加解密Java、C#、php

    TripleDES说明:     TripleDES(3Des)和Des都是对称加密算法,TripleDes是Des加密算法的增强版本,这里主要说的是TripleDes加密算法的应用.     工作中 ...

  5. Mininet系列实验(五):Mininet设置带宽之简单性能测试

    1.实验目的 该实验通过Mininet学习python自定义拓扑实现,可在python脚本文件中设计任意想要的拓扑,简单方便,并通过设置交换机和主机之间链路的带宽.延迟及丢包率,测试主机之间的性能.在 ...

  6. Mac 中使用phpstorm 修改文件提示"only read",只读权限

    在终端中执行命令: 给max系统用户liutao赋予整个项目文件权限,即可成功 sudo chown -R liutao /Users/liutao/Desktop/vagrant/newprojec ...

  7. linux使用nslookup查询dns

    nslookup命令主要用于查询DNS信息 nslookup工具的安装以及使用使用yum install bind-utils安装即可 交互模式与非交互模式直接运行nslookup即可进入交互模式,连 ...

  8. Flutter移动电商实战 --(51)购物车_Provide中添加商品

    新加provide的cart.dart页面 引入三个文件.开始写provide类.provide需要用with 进行混入 从prefs里面获取到数据,判断有没有数据,如果有数据就返转正List< ...

  9. es6对象复制合并 Object.assign

    对象的复制 var obj= { a: 1 }; var copy = Object.assign({}, obj); console.log(copy); //{ a: 1 } 对象的合并和封装 v ...

  10. 24 Flutter官方推荐的状态管理库provider的深入使用、初始化修改状态、父子组件同步状态

    加群452892873 下载对应24课文件,运行方法,建好项目,直接替换lib目录,在往pubspec.yaml添加上一下扩展. cupertino_icons: ^0.1.2 flutter_swi ...