Netty源码剖析-断开连接
参考文献:极客时间傅健老师的《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源码剖析-断开连接的更多相关文章
- Netty源码剖析-关闭服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: ----源码: 先在服务端加个断点和修改下代码:如 ...
- Netty源码剖析-接受数据
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:worker thread ①多路复用器(Select ...
- Netty源码剖析-构建链接
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: 和启动一样也是有两个线程完成的,boss threa ...
- Netty源码剖析-启动服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...
- Netty 源码剖析之 unSafe.write 方法
前言 在 Netty 源码剖析之 unSafe.read 方法 一文中,我们研究了 read 方法的实现,这是读取内容到容器,再看看 Netty 是如何将内容从容器输出 Channel 的吧. 1. ...
- Netty源码剖析-发送数据
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 开始之前先介绍下Netty写数据的三种方式: ①:write:写到一 ...
- Netty源码剖析-业务处理
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:worker thread 触发pipeline.fi ...
- Netty学习笔记(三)——netty源码剖析
1.Netty启动源码剖析 启动类: public class NettyNioServer { public static void main(String[] args) throws Excep ...
- Netty 源码剖析之 unSafe.read 方法
目录: NioSocketChannel$NioSocketChannelUnsafe 的 read 方法 首先看 ByteBufAllocator 再看 RecvByteBufAllocator.H ...
随机推荐
- hdu6731 Angle Beats(ccpc秦皇岛A,计算几何)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6731 题意: 给出$n$个点,有$q$次询问 每次询问给出一个点$b$,求这$n+1$个点,组成直角 ...
- js 返回两数(包含这两数)之间的随机数函数
function selectFrom( lowerValue, upperValue ){ var choices = upperValue - lowerValue + 1; return Mat ...
- 梯度下降法(BGD & SGD & Mini-batch SGD)
梯度下降法(Gradient Descent) 优化思想:用当前位置的负梯度方向作为搜索方向,亦即为当前位置下降最快的方向,也称“最速下降法”.越接近目标值时,步长越小,下降越慢. 如下图所示,梯度下 ...
- 解决用root用户及密码可以直接登陆某LINUX系统,但是用ssh登陆,系统却总是提示密码不对
引用 vi /etc/ssh/sshd_config 将PermitRootLogin项改为yes service sshd restart 重启sshd服务即可
- python 可执行
py2exe使用方法 py2exe作者:zzj 日期:2006-07-05字体大小: 小 中 大 一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.ex ...
- mybatis的maven配置
<!-- mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId ...
- H5内嵌原生app
前言 其实我们不管是从ios还是安卓都可以看出 原生app能内嵌H5的原因是因为有了webview这个app内嵌浏览器视图,从而使得我们可以开发html然后加载到app中(原理几乎跟pc端请求.加载. ...
- 浅谈TextView Ellipsize效果与Marquee跑马灯无效果问题
说到TextView 效果,相信大家一定熟悉跑马灯. 先来看看 Ellipsize是什么,Ellipsize 从开发技术上翻译为省略效果.故名思议,就是当文本无法显示全部时,用什么效果来显示未显示的部 ...
- ISO/IEC 9899:2011 条款6.2.1——标识符的作用域
6.2.1 标识符的作用域 1.一个标识符可以表示一个对象:一个函数:一个结构体.联合体或枚举的一个标签或一个成员,一个typedef名:一个标签名:一个宏名:或一个宏形参.相同的标识符可以在程序中不 ...
- UI——DOM
原文链接:Introduction to the DOM Introduction The Document Object Model, usually referred to as the DOM, ...