Netty源码剖析-构建链接
参考文献:极客时间傅健老师的《Netty源码剖析与实战》Talk is cheap.show me the code!
----主线:
和启动一样也是有两个线程完成的,boss thread 和 worker thread;
boss thread:
①NioEventLoop中的selector轮询创建连接事件(OP_ACCEPT)
②创建socket channel
③初始化socket channel 并从 worker group 中选择一个NioEventLoop
worker thread:
④将socket channel 注册到选择的NioEventLoop的selector
⑤注册读事件(OP_READ)到selector上
----源码解释:
在NioEventLoop中找到run();在run()里面有个processSelectedKeys();

点进去后

其中processSelectedKeysOptimized();不用jdk的selector.selectedKeys(),性能更好,垃圾回收更少;接着跟进去;

打上断点,这个地方开始就轮询事件了。然后debug启动服务端和客户端(代码参考https://www.cnblogs.com/-qilin/p/11671763.html)!

然后进入该方法,然后依次执行;

其中16就代表着OP_ACCEPT;进入unsafe.read().中有这么个代码

接着再进doReadMessages();SocketChannel ch = SocketUtils.accept(javaChannel());表示接受新连接创建SocketChannel;

接着再跟进去

上图的断点return serverSocketChannel.accept();表示非阻塞模式下,没有连接请求时返回null;接着继续往下走会来到这个地方:

pipeline.fireChannelRead(readBuf.get(i));可以看出有多个handler,接着找到ServerBootstrapAcceptor这个handler,然后找到channelRead()方法,打个断点跳过来:

往下走childGroup.register(child).addListener();加个断点跟进去:

然后在一步一步的跟进register()后来到下面的代码,打个断点之后再跟进:

进入register0()

看到熟悉的doRegister(),跟进去看看:

这里和上篇源码解释的一样,继续往下走:

在跳转到head上,找到read()方法:

然后进去看看

又看到熟悉的doBeginRead();跟进去看看

与之不同的是这时候readInterestOp不是16而是1了,是OP_READ而非OP_ACCEPT了。这时候已经走完了。可以看控制台:

----总结:
接收连接的本质:
selector.select()/selectNow()/select(timeoutMillis)发现OP_ACCEPT事件,处理:
SocketChannel socketChannel = serverSocketChannel.accopt();
selectionKey = javaChannel().register(eventLoop().unwrappedSelector(),0,this);
selectKey.interestOps(OP_READ);
创建连接的初始化和注册是通过pipeline.fireChannelRead在ServerBootstrapAcceptor中完成的。
第一次Register并不是监听OP_READ,而是0;
selectionKey = javaChannel().register(eventLoop().unwrappedSelector(),0,this);
最终监听OP_READ是通过“Register”完成后的fireChannelActive(io.netty.channel.AbstractChannel.AbstractUnsafe#register0中)来触发的;
Worker's NioEventLoop是通过Register操作执行来启动。
接受连接的读操作,不会尝试读取更多次(16次)。
我只想做的更好,仅此而已。
Netty源码剖析-构建链接的更多相关文章
- Netty 源码剖析之 unSafe.write 方法
前言 在 Netty 源码剖析之 unSafe.read 方法 一文中,我们研究了 read 方法的实现,这是读取内容到容器,再看看 Netty 是如何将内容从容器输出 Channel 的吧. 1. ...
- Netty源码剖析-关闭服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: ----源码: 先在服务端加个断点和修改下代码:如 ...
- Netty源码剖析-断开连接
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: ----源码: 在NioEventLoop的unsa ...
- 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源码剖析与实战>Talk is cheap.show me the code! ----主线:worker thread ①多路复用器(Select ...
- Netty源码剖析-启动服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...
- Netty学习笔记(三)——netty源码剖析
1.Netty启动源码剖析 启动类: public class NettyNioServer { public static void main(String[] args) throws Excep ...
- Netty 源码剖析之 unSafe.read 方法
目录: NioSocketChannel$NioSocketChannelUnsafe 的 read 方法 首先看 ByteBufAllocator 再看 RecvByteBufAllocator.H ...
随机推荐
- LibreOJ #6000. 「网络流 24 题」搭配飞行员
二次联通门 : LibreOJ #6000. 「网络流 24 题」搭配飞行员 /* LibreOJ #6000. 「网络流 24 题」搭配飞行员 二分图最大匹配 Dinic最大流 + 当前弧优化 */ ...
- CSS定位中“父相子绝”
一.定位的介绍 定位有三种:相对定位(position:relative).绝对定位(position:absolute).固定定位(position:fixed) 二.三种定位的用法,特点和实例 2 ...
- Linux之创建多个子进程
/*** fork_test.c ***/ #include<stdio.h> #include<stdlib.h> #include<unistd.h> int ...
- linux下查看内存频率,内核函数,cpu频率
查看CPU: cat /proc/cpuinfo # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理 ...
- Atcoder ABC 139D
Atcoder ABC 139D 解法: 等差数列求和公式,记得开 $ long long $ CODE: #include<iostream> #include<cstdio> ...
- python 装饰器应用
1 注册回调函数 下面这个示例展示了通过URL的路由来调用相关注册的函数示例: class MyApp(): def __init__(self): self.func_map = {} def re ...
- CISCO实验记录九:NAT地址转换
1.静态NAT地址转换 #ip nat inside source static 192.168.12.1 192.168.23.4 //将12.1转为23.4 必须精确到主机IP 而不能是某个网段 ...
- Ubuntu 18.04系统下arm-linux-gcc交叉编译器安装
Ubuntu 18.04系统: arm-linux-gcc 4.4.3版本. 安装arm-linux-gcc将压缩包arm-linux-gcc.tar.gz解压到arm-linux-gcc文件夹tar ...
- kotlin 泛型函数
fun<T> singletonList(item:T):List<T>{ ..... } fun<T>T.basicToString():String{ .... ...
- smarty里通过循环section嵌套结合IF语句实现工程进度显示
<ul class="site_ul"> <{section name=constructionlist loop=$ly}> <li class=& ...