`
zhaohaolin
  • 浏览: 983970 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

分析Netty工作流程[转]

    博客分类:
  • JAVA
阅读更多

下面以Netty中Echo的例子进行流程跟踪,并简要的

服务器启动->客户端连接-> 服务器处理连接-> 服务器处理客户端数据<-> 客户端处理服务器数据

 

1:客户端连接:

 

我们直接看这行代码:

bootstrap.connect(new InetSocketAddress(host, port));

通过帮助类ClientBootstrap来连接服务器。

Debug源码进去发现最后是某个Channel类进行connect操作。 

而这个Channel是如何来的呢?其实是从前面的 ChannelFactory和ChannelPipelineFactory得到的。 

Channel.connect-> AbstractChannel.connect->Channels.connect(…); 

Channels是Channel的帮助类,封装一些常用的操作。在封装操作时,基本都是触发事件。

这里发起一个connectd的Downstream的事件。

 

所有的事件都是丢给ChannelPipeline进行管理,ChannelPipeline使用了责任链模式来将事件传送给注册到Pipeline中的ChannelHandler,由ChannelHandler进行处理。如果遍历了所有的ChannelHandler后则交给ChannelSink进行处理,ChannelSink根据不同的事件进行不同的处理,对于connect事件,ChannelSink发送连接操作后则将该Channel注册到NioWorker中,以后的任何事件都通过NioWorker(封装selector的操作)来进行处理。

 

客户端连接的流程为:

ClientBootstrap.connect –>Channel.connect->

AbstractChannel.connect->Channels.connect(…)

         -> 发送connect事件-> ChannelSink->发起实际的连接操作->将Channel注册给Nioworker

 

2:服务器启动:

         bootstrap.bind(…)-> 触发ServerSocketChannel.open()的事件

->捕捉open事件,channel.bind-> Channels.bind(…) -> 发起bind命令-> PipelineSink进行处理-> 使用socket进行bind,等待连接事件。

 

3: 服务器处理连接:

   服务器启动后,NioServerSocketPipelineSink.Boss.run()在监听accept事件-> 捕捉到accept事件 -> 将NioWorker进行注册NioSocketChannel

-> 向java.nio.SocketChannel注册op_read的监听。

 

4:客户端开始向服务器发送数据:

    当客户端连接Server后,就会发起Connected的upstream事件->通过Pipeline进行处理-> SimpleChannelUpstreamHandler.handleUpstream()->

EchoClientHandler.channelConnected()

 

5:服务器端接收并处理数据

    接收数据:

    NioWorker.run()->nioworker. processSelectedKeys()->

Nioworker. Read()将从SocketChannel读取的数据封装成

ChannelBuffer ->发送upstream事件:fireMessageReceived(channel,buffer) –> 由注册到Pipeline中的Hanlder进行处理: EchoServerHandler. messageReceived(…)

 

    发送数据:

e.getChannel().write(e.getMessage());->Channels.write()->

发起downstream事件-> NioServerSocketPipelineSink. handleAcceptedSocket()将向外写的事件放入Channel中,然后通过NioWorker.writeFromUserCode()进行发送。

 

6:客户端:客户端的流程和服务器端类似。

 

 

总结:

1: Netty将操作封装成事件,比如: 发起连接时,产生connect的downstream事件。连接完毕后,产生upstream的connect事件。 

2:所有的事件都是放入Pipeline进行传送,传送的过程中可能被注册到pipeline中的Handler进行处理

3:在Pipeline传送完后,都必须都通ChannelSink进行处理。Sink默认处理了琐碎的操作,必须连接、读写等等。 

4:Channels:几乎所有的操作都能在这里找到,当然Channels一般是发送事件

5:NioWorker: 处理IO事件的核心类,并承担了分发的责任。

分享到:
评论

相关推荐

    NanguoCoffee 分析Netty工作流程

    NULL 博文链接:https://sun123start.iteye.com/blog/1893693

    93个netty高并发教学视频下载.txt

    05_Netty执行流程分析与重要组件介绍;06_Netty回调与Channel执行流程分析;07_Netty的Socket编程详解;08_Netty多客户端连接与通信,09_Netty读写检测机制与长连接要素,10_Netty对WebSocket的支援;11_Netty实现...

    精通并发与netty视频教程(2018)视频教程

    5_Netty执行流程分析与重要组件介绍 6_Netty回调与Channel执行流程分析 7_Netty的Socket编程详解 8_Netty多客户端连接与通信 9_Netty读写检测机制与长连接要素 10_Netty对WebSocket的支援 11_Netty实现服务器端与...

    精通并发与netty 无加密视频

    第5讲:Netty执行流程分析与重要组件介绍 第6讲:Netty回调与Channel执行流程分析 第7讲:Netty的Socket编程详解 第8讲:Netty多客户端连接与通信 第9讲:Netty读写检测机制与长连接要素 第10讲:Netty对...

    精通并发与 netty 视频教程(2018)视频教程

    精通并发与netty视频教程(2018)视频教程 netty视频教程 Java视频教程目录: 1_学习的要义 2_Netty宏观理解 3_Netty课程大纲深度解读 4_项目环境搭建与Gradle配置 5_Netty执行流程分析与重要组件介绍 6_Netty回调与...

    Netty-Notes:Netty原始分析,包含各种流程图-源码包

    净额票据 BIO,为传统的每个连接的线程,分为I / O。类似排队打饭,一个连接数据处理完,在处理下一个连接; NIO,为Reactor模式,非附加I / O。类似点菜,等待被叫,先接收连接,当有请求时在去处理;...在Netty服

    Netty教程:十二个实例带你轻松学习Netty

     每个实例简洁、清爽、实用,重点在“用”上,即培训大家如何熟练的使用Netty解决实际问题,抛弃以往边讲应用边分析源码的培训模式所带来的“高不成低不就”情况,在已经能够熟练使用、并且清楚开发流程的基础上再...

    第四课:zookeeper ZAB协议实现源码分析1

    课程概要:启动流程源码分析快照与事物日志的存储结构一、启动流程知识点:工程结构介绍启动流程宏观图集群启动详细流程netty 服务工作机制1.工程结构介绍项目地址

    java开源包3

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    互联网实时聊天系统 (Spring + Netty + Websocket).zip

    供应链管理 (SCM):优化供应链流程,包括采购、库存、物流、分销等环节。 决策支持系统 (DSS):辅助决策者分析复杂问题,提供数据驱动的决策建议。 网络系统: 包括局域网 (LAN)、广域网 (WAN)、互联网 ...

    微信小程序后台,包含WebSocket(微信小程序通信)和Netty(物联网通信).zip

    爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP...

    深入探索RocketMQ源码:透视消息中间件的内核机制

    重点分析了NameServer的作用,即维护Broker服务地址和为Producer及Consumer提供服务获取Broker列表​​。Broker作为RocketMQ业务的核心,负责所有消息的存储和转发,并采用类似JavaWeb开发的MVC架构​​。此外,...

    copyFromITDragonBlog

    Netty 服务启动流程分析,拆包粘包,编解码技术,数据通信,心跳监测,BIO,NIO,AIO区别,常见面试题。 系列博客: MySQL MySQL 索引优化分析,行锁和表锁机制。 系列博客: ITDragon 有零碎知识: , 。点击进入.....

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 13.RPC底层通讯原理之Netty线程模型源码分析.wmv │ │ │ ├─14.分库分表之后分布式下如何保证ID全局唯一性 │ │ 14.分库分表之后分布式下如何保证ID全局唯一性.mp4 │ │ │ └─15.大型公司面试必答之...

    daydayup:每天都在进步,每周都在总结,Java架构师成长之路。目前已经完成:MongoDB,Netty,Nginx,MySQL,Java,Redis,Shiro,Solr,SpringBoot,SpringData,SSO,Mybatis,Kotlin,还在持续更新中

    系列博客:ShiroShiro 是Java的安全框架,使用简单,功能强大 系列博客:NettyNetty 服务启动流程分析,拆包粘包,编解码技术,数据通信,心跳监测,BIO,NIO,AIO区别,常见面试题。 系列博客:MySQLMySQL 索引优化...

    基于CAN总线智能建筑监控系统的通信协议设计

    从研究CAN2.OB总线规范入手,介绍了CAN总线规范的硬件基础,分析了CAN总线报文格式,通过对报文标识符的分配,设计了应用于该系统的通信协议,并给出了软件设计流程,较好地解决了智能建筑监控系统通信过程中的仲裁...

    java开源包8

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包1

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包11

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

Global site tag (gtag.js) - Google Analytics