BIO/NIO/ANO笔记
一: netty服务器启动过程
serverBootstrap.bind(hostname, port)--->
doBind(localAddress);-->
1.1: initAndRegister();初始化并注册-->
1.1.1: channelFactory.newChannel();-->ReflectiveChannelFactory.newChannel()--->可以看到这里是使用反射创建的 channel对象,这里的channel对象是JDK的channel,然后netty包装了JDK的channel
1.1.2: init(channel); 初始化channel,核心是和channelPipeline相关,--->ServerBootstrap.init()-->这个方法可以看出是给channel的 各个map设置值.给 channel的 pipeline添加处理器, channel添加pipeline
1.1.2.1: pipeline.addLast(handler) 这个是初始化的核心,设置pipeline --->DefaultChannelPipeline.addList()-->checkMultiplicity(handler);这里看到先检查双向链表的容量--------
newCtx = newContext(group, filterName(name, handler), handler);这个是创建了一个新的上下文 AbstractChannelHandlerContext对象,这个对象负责ChannelHandler
和 ChannelPipeline 之间关联, 之后将这个context添加到双向链表最后, 最后,异步/同步调用callHandlerAdded0(newCtx);
1.1.3: ChannelFuture regFuture = config().group().register(channel); ----> 这是将 初始化完成的 NioServerSocketChannel 注册到对应的事件循环组中,(bossgroup, workgroup),并返回这个异步执行占位符 future
1.2: doBind0(regFuture, channel, localAddress, promise);--->channel.bind(localAddress, promise)--->DefaultChannelPipeline.bind() -->tail.bind(localAddress, promise);--->next.invokeBind(localAddress, promise);
--->((ChannelOutboundHandler) handler()).bind(this, localAddress, promise);--->DefaultChannelPipeline.bind()-->unsafe.bind(localAddress, promise);-->AbstractChannel.bind()-->doBind(localAddress);
--->NioServerSocketChannel.dobind()-->javaChannel().bind(localAddress, config.getBacklog());到这里可以看到是获取到了 java的原生serverSocketChannel,然后绑定端口
端口绑定之后,至此整个启动过程结束, 然后服务器进入---> NioEventLoop类protected void run() {} 这是一个无限循环代码,进行监听是否有task进来, runAllTask
netty启动过程梳理:
1: 创建二个 EventLoopGroup线程池数组, 数组大小默认 CPU*2, 方便chooser选择线程池时提高性能
2: BootStrap将 boss设置为group属性, 将worker设置为childer属性
3: 通过 bind方法 启动服务器, 内部重要方法是 initAndRegister 和 dobind方法
3.1: initAndRegiser方法,会反射创建 NioServerSocketChannel,及相关的NIO对象,pipeline unsafe, 同时也为pipeline初始化了 head节点 tail节点
3.2: 初始化成功之后, dobind方法 最终是调用 NioServerSocketChannel 的dobind方法,,对JDK的 channel 和端口进行绑定,完成绑定之后,完成netty服务器所有启动,并开始后监听连接事件
二: netty接受请求过程源码分析
启动client,发送请求,---->NioEventLoop类的protected void run() {}--->processSelectedKeys();---(selector.selectedKeys() 这个方法返回所有注册在select选择器上的,有事件发生的通道的 sekectedKey集合,通过sekectedKey就可以反向获取到对应通道,然后就可以进行读写操作了,)
--->processSelectedKeysOptimized();这是请求发送有数据--->processSelectedKey(k, (AbstractNioChannel) a);---->unsafe.read();这是开始读取数据--->AbstractNioByteChannel.read()---pipeline.fireChannelRead(byteBuf);这里是循环读取数据
--->AbstractChannelHandlerContext.invokeChannelRead(head, msg);--->next.invokeChannelRead(m);----->channelRead(this, msg);--->ServerBootstrap.channelRead(ChannelHandlerContext ctx, Object msg)
--->childGroup.register(child)这一步是将child 注册到workerGroup事件循环组的线程池中,并添加一个监听器--->继续追reginster方法--->MultithreadEventLoopGroup.register(Channel channel)-->SlngleThreadEventLoop.register()
--->promise.channel().unsafe().register(this, promise);---->AbstractChannel.register()--->register0(promise);--->beginRead();---.doBeginRead();--->AbstractNioChannel.doBeginRead() 到这里客户端的连接完成了,接下来是监听读事件
netty接受请求过程梳理:
总体流程: 接受连接--->创建一个新的NioSocketChannel--->注册到一个workerEventLoop上---> 注册select Read事件
1: 服务器 轮询Accept事件, 获取事件后调用unsafe的read方法
2: doReadMessages 用于创建NioSocketChannel,这个对象包装JDK的NioChannel客户端
3: 随后执行 pipeline.fireChannelRead方法,开始读取数据
三: ChannelPipeline ChannelHandler ChannelHandlerContext 三者之间的关系
BIO/NIO/ANO笔记的更多相关文章
- Java:NIO 学习笔记-3
Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...
- Java:NIO 学习笔记-2
Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...
- (转)也谈BIO | NIO | AIO (Java版)
原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...
- Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化
Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomc ...
- 拿搬东西来解释udp tcpip bio nio aio aio异步
[群主]雷欧纳德简单理解 tcpip是有通信确认的面对面通信 有打招呼的过程 有建立通道的过程 有保持通道的确认 有具体传输udp是看到对面的人好像在对面等你 就往对面扔东西[群主]雷欧 ...
- 也谈BIO | NIO | AIO (Java版--转)
关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...
- tomcat bio nio apr 模式性能测试
转自:tomcat bio nio apr 模式性能测试与个人看法 11.11活动当天,服务器负载过大,导致部分页面出现了不可访问的状态.那后来主管就要求调优了,下面是tomcat bio.nio.a ...
- IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...
- Netty5序章之BIO NIO AIO演变
Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...
随机推荐
- 如何在C或C++代码中嵌入ARM汇编代码
转载自:http://blog.csdn.net/roland_sun/article/details/42921131 大家知道,用C或者C++等高级语言编写的程序,会被编译器编译成最终的机器指令. ...
- hdu2276 矩阵构造
题意: 给了n个灯泡的状态,他们绕成一个环,0是灭,1是亮,每一秒灯泡的状态都会改变,规则是如果当前这个灯泡的左边的灯泡当前是状态1,那么下一秒当前的这个灯泡状态就改变0变1,1变0,最后问 ...
- Python中pip安装报错Unable to create process using '....'
因为我本人在电脑上安装了python2和python3,所以在安装的时候,把两个python的安装目录都安装到G盘了.然后两个python的执行文件分别改成了 python2.exe 和 pytho ...
- Host头部攻击
在HTTP的请求报文中,我们经常会看到Host字段,如下 GET /test/ HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade- ...
- 【pytest系列】- pytest测试框架介绍与运行
如果想从头学起pytest,可以去看看这个系列的文章! https://www.cnblogs.com/miki-peng/category/1960108.html 前言 目前有两种纯测试的测 ...
- Day004 Scanner进阶
Scanner进阶 例1 Scanner scanner = new Scanner(System.in); //从键盘接收数据 int i = 0; float f = 0.0f; System.o ...
- Codeforces Beta Round #107(Div2)
B.Phone Numbers 思路:就是简单的结构体排序,只是这里有一个技巧,就是结构体存储的时候,直接存各种类型的电话的数量是多少就行,在读入电话的时候,既然号码是一定的,那么就直接按照格式%c读 ...
- 透过“锁”事看InnoDB对并发的处理?
一. 并发场景下的问题 相对于串行处理方式,并发的事务处理可显著提升数据库的事务吞吐量.提高资源利用率.在MySQL实际应用中,根据场景的不同,可以分为以下几类: 读读并发 读写并发 写写并发 在这些 ...
- linux查看文件的编码格式的方法 set fileencoding PYTHON
linux查看文件的编码格式的方法 set fileencoding 乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp93 ...
- 怎么样在同一个word文件中删除不同节数的页眉
1.双击页眉,进入页眉编辑状态2.选择准备删除页眉的节,直接额删除即可.注意:为不至于因该节的改动影响其他节的页眉,需要在页眉设置上,每节都要取消链接到前一节页眉 把那张的前面和后面都插入分隔符,在页 ...