`
zhaohaolin
  • 浏览: 1016196 次
  • 性别: 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工作流程

    本文将深入探讨Netty的工作流程,通过分析其核心组件和机制,帮助理解如何利用Netty构建高效的网络应用。 Netty 的工作流程主要基于Reactor模式,它包含以下几个关键组件: 1. **BossGroup**:BossGroup 负责接收...

    Netty4.x源码分析详解

    在分析 Netty 源码时,建议结合实际的网络通信场景,模拟各种网络事件,观察代码的执行流程,这有助于更好地理解和掌握 Netty 的工作原理。此外,阅读官方文档、参与社区讨论以及参考已有的源码分析文章也是学习的...

    Netty权威指南-Netty源码

    源码分析时,首先需要关注的是 Netty 的启动流程,这通常从 `ServerBootstrap` 类开始。ServerBootstrap 配置了 EventLoopGroup(包含多个 EventLoop)和 Channel 实例,如 NioServerSocketChannel。然后通过绑定...

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

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

    learning-netty.zip

    - **源码分析篇**: 分析Netty关键组件的内部实现,如BossGroup、WorkerGroup的工作流程,以及EventLoop的调度机制。 - **实战篇**: 提供实际项目中使用Netty的案例,比如构建WebSocket服务器、HTTP服务器等。 - *...

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

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

    Netty-入门Netty编码

    通过阅读源码,我们可以更好地理解其内部工作原理,例如事件的处理流程、I/O 操作的优化以及内存管理策略。 至于“工具”,Netty 可以与其他开发工具和库无缝集成,例如日志框架、测试工具等。例如,我们可以使用 ...

    网络通信 netty_io

    Netty源码分析是理解其高性能背后的机制的关键。通过阅读和学习Netty的源码,我们可以了解到它如何利用NIO的非阻塞特性实现高效的事件驱动模型,以及如何优化内存管理和线程调度。此外,Netty还提供了丰富的处理器链...

    精通并发与netty 无加密视频

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

    以netty4.1源码中的EchoServer为例对netty的源码进行分析.docx

    在本文中,我们将深入分析 Netty 4.1 源码中的 EchoServer 示例,以理解其核心组件和工作原理。 首先,我们关注 EchoServer 服务端的初始化,这涉及到两个关键组件:`bossGroup` 和 `workerGroup`。它们都是 `...

    咕泡学院_Tom_JavaVIP课程_深入分析Netty源码1

    JavaVIP课程深入分析了Netty源码,由Tom老师主讲,主要针对咕泡学院的高级Java学员。本文档详细探讨了Netty框架的核心组件及其使用,特别关注了BootStrap类在客户端和服务器端的角色。 BootStrap是Netty提供的一种...

    NettyChannel

    NettyChannel是一个基于Netty框架的测试程序,它包含了客户端(client)和服务器端(server)的实现,目的是为了深入理解Netty中的Channel概念及其工作流程。Netty是一个高性能、异步事件驱动的网络应用程序框架,...

    netty权威指南 源码

    此外,源码分析有助于我们了解 Netty 如何处理网络事件、协议解析、线程调度等核心问题,对于提高开发水平和解决实际问题大有裨益。 书中可能涵盖了以下主题: - Netty 的设计理念和架构 - 异步事件驱动模型的实现...

    多线程并发编程在Netty的应用分析

    《多线程并发编程在Netty中的应用分析》 在当今高性能网络编程领域,Netty以其高效、灵活和易用的特性,成为了许多系统开发的首选框架。本篇内容将深入探讨多线程并发编程在Netty中的核心应用,帮助读者理解如何...

    netty分享包括PPT和demo

    3. **Netty的工作流程** - 客户端发起连接请求,服务器端接收连接。 - 数据通过Channel流入,经过Pipeline中的各个Handler进行处理。 - 事件(如读取、写入、关闭连接等)被EventLoop检测到,触发相应的处理器...

    netty权威指南2 源码

    《Netty权威指南》第二版...通过对这些文件的深入分析,我们不仅能理解Netty的内部工作机制,还能学习到如何构建和维护高性能的网络应用。这将对提升Java网络编程能力,尤其是分布式系统的设计和实现具有极大的帮助。

    spring netty 整合 源代码

    将两者结合,Spring负责业务逻辑和控制流程,Netty处理底层网络通信,形成一种高效的架构。 **二、项目结构分析** 根据提供的文件名,我们可以推测这是一个基于Maven构建的Java工程。`pom.xml`是项目的配置文件,...

Global site tag (gtag.js) - Google Analytics