一: 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. Python 图片转字符图

    pip install Image argparse pillow from PIL import Image import argparse #命令行输入参数处理 parser = argparse ...

  2. XCTF-fakebook

    fakebook stm的fakebook,乍一看还以为是facebook,果然fake 看题 有登录和注册两个功能点 看了下robots.txt,发现有备份文件 果断下载,内容如下 这里的blog在 ...

  3. ppt技巧一四步法调整PPT

    声明:本文所有截图来源于网易云课堂--<和秋叶一起学PPT>,仅作为个人复习之用,特此声明! 常见配色方案 可以从模板或公司logo取色 图片的选择要高清.风格.主题一致

  4. C#读写内置类型的数据时是否原子操作

    Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uin ...

  5. Jenkins 基础篇 - Server 配置

    我们使用 Jenkins 部署服务之前要先配置我们的目标服务器,配置目标服务器也很简单,就是将服务器的 IP.账号密码或者账号密钥配置在 Jenkins中.在演示服务器配置之前我们要先知道 Linux ...

  6. useradd linux系统创建用户和设置密码简单脚本-1

    useradd linux系统创建用户和设置密码简单脚本-1 linux_wangqiang 2019-12-04 20:51:18 65 收藏展开#!/bin/bash#快速创建用户 使用$1第一个 ...

  7. 060.Python组件-中间件

    一 中间件基本介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会 ...

  8. 050.Python前端jQuery

    一 jQuery是什么? jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. jQuery是继prototype之后又一个优秀的Ja ...

  9. Java 语言的主要特性

    Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用. Java丢弃了C++中很少使用的.很难理解的.令人迷惑的那些特性,如操作符重载.多继承.自动的强 ...

  10. Winsock2使用记录

    本文地址:https://www.cnblogs.com/oberon-zjt0806/p/14814144.html WinSock 2 MSDN文档:https://docs.microsoft. ...