一: 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笔记的更多相关文章

  1. Java:NIO 学习笔记-3

    Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...

  2. Java:NIO 学习笔记-2

    Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...

  3. (转)也谈BIO | NIO | AIO (Java版)

    原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...

  4. Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化

    Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomc ...

  5. 拿搬东西来解释udp tcpip bio nio aio aio异步

     [群主]雷欧纳德简单理解 tcpip是有通信确认的面对面通信   有打招呼的过程  有建立通道的过程 有保持通道的确认    有具体传输udp是看到对面的人好像在对面等你 就往对面扔东西[群主]雷欧 ...

  6. 也谈BIO | NIO | AIO (Java版--转)

    关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  7. tomcat bio nio apr 模式性能测试

    转自:tomcat bio nio apr 模式性能测试与个人看法 11.11活动当天,服务器负载过大,导致部分页面出现了不可访问的状态.那后来主管就要求调优了,下面是tomcat bio.nio.a ...

  8. IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)

    有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...

  9. Netty5序章之BIO NIO AIO演变

    Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...

随机推荐

  1. PAT 乙级 -- 1013 -- 数素数

    题目简介 令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数. 输入格式: 输入在一行中给出M和N,其间以空格分隔. 输出格式: 输出从PM到PN ...

  2. POJ 3613 快速幂+Floyd变形(求限制k条路径的最短路)

    题意:       给你一个无向图,然后给了一个起点s和终点e,然后问从s到e的最短路是多少,中途有一个限制,那就是必须走k条边,路径可以反复走. 思路:       感觉很赞的一个题目,据说证明是什 ...

  3. 路由协议之RIP

    目录 RIP协议 RIP的路由汇总和过滤 RIP的认证 RIP的防环机制 华为/思科中的配置 RIP协议 RIP协议是一种内部网关协议(IGP),底层是贝尔曼福特算法,是一种动态路由选择协议,用于自治 ...

  4. POJ2446 模板盖格子 简单二分匹配

    题意:       给你一个n*m的格子,有的格子上有坑,然后让你用1*2的东西去覆盖所有没有坑的格子,不能重叠,坑上也不能放东西覆盖,问是否能成功. 思路:        简单题目,每个格子和四周的 ...

  5. Windows PE 重定位表编程(枚举重定位地址)

    原理之前单独总结过,在这里: http://blog.csdn.net/u013761036/article/details/54051347 下面是枚举重定位信息的代码: // ReLocation ...

  6. MS06-040漏洞研究(下)【转载】

    课程简介 经过前两次的分析,我们已经对Netapi32.dll文件中所包含的漏洞成功地实现了利用.在系统未打补丁之前,这确实是一个非常严重的漏洞,那么打了补丁之后,这个动态链接库是不是就安全了呢?答案 ...

  7. Win10安装Ubuntu子系统(WSL)

    一:设置子系统环境 关闭所有运行的程序,打开 控制面板→卸载程序→启用或关闭windows功能→勾选上适用于Linux的windows子系统 ,然后确定,完成会提示重启电脑,确定重启,等重启电脑后在操 ...

  8. 计算机网络参考模型,IP地址及MAC地址查看方法,数据包封装过程

    分层思想 首先,计算机网络参考模型,是基于分层思想而出现的.分层思想,就是将复杂流程分解为几个功能单一的子过程. 优点: 可以让整个流程更加清晰, 让复杂问题简单化, 更容易发现问题,并真对性的解决问 ...

  9. H5性能分析

    一.所有的浏览器都会支持一个W3C的标准 具体标准可以查看:https://www.w3.org/TR/navigation-timing/ 资源加载指标分析: Prompt for unload:访 ...

  10. 登录框-element-ui 样式调节

    element-ui样式调节 首先设置布局 如果想要实现如下效果 需要两行,然后设置偏移,第一行中间只是站位,没有内容,可以考虑使用div占位,设置最小高度 el-card调整圆角 border-ra ...