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 ...
随机推荐
- centos7mongo集群
1.安装 cat > /etc/yum.repos.d/mongodb.repo << EOF[mongodb-org-3.6]name=MongoDB Repositorybase ...
- P3119 [USACO15JAN]草鉴定
约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后回到1号草场.她想经过尽可能多的草场,贝西在通一个草 ...
- 一些scala的操作
Scala获取当前目录下所有文件 import java.io.File //获取目录下的所有文件,当前项目目录输入new File(".") def getFiles1(dir: ...
- 快速打造自己的PHPStorm主题
---恢复内容开始--- 一个优雅和舒适的界面,可以增加过多写入代码的动力. Phpstorm小型的白色主题比较简陋.为了打造一个优雅和舒适的界面,我们安装一件叫Material Theme UI的插 ...
- CSS绘制三角形—border法
1. 实现一个简单的三角形 使用CSS盒模型中的border(边框)即可实现如下所示的三角形: CSS实现简单三角形 实现原理: 首先来看在为元素添加border时,border的样子:假设有如下 ...
- 读取文件名.cpp
#include <io.h> #include <iostream> #include <string> #include <windows.h> # ...
- MongoDB与RoboMongo的安装+python基本操作MongoDB
MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.作为一个适用于敏捷开发的数据库,MongoDB的数据 ...
- 20165223《网络对抗技术》Exp 8 Web基础
目录 -- Web基础 实践说明 实践目标 基础问答 实践内容 Web前端:HTML Web前端:JavaScript Web后端:MySQL Web后端:PHP SQL注入,XSS攻击测试 实验遇到 ...
- AWS 配置IPv6
- arcgis python ListEnvironments 函数可返回地理处理环境名称列表。
import arcpy environments = arcpy.ListEnvironments() # Sort the environment names environments.sort( ...