简单过一下Netty3.6.6.Final源码,让自己对各个流程有个稍微清晰的理解,只是文字描述,尽量描述简单,有时间再画画图
Server启动:
1.new ServerBootstrap
构造NioServerSocketChannelFactory,用来创建NioServerSocketChannel对象(newChannel方法)
1..NioServerSocketChannel:是一个parent Channel,负责接收客户端进来的连接并创建child Channel
2..NioServerSocketChannelFactory中有两类线程池:
1...BossPool<NioServerBoss> bossPool
boss线程池:每个绑定的ServerSocketChannel都有自己的boss线程池,默认为一个线程,它负责接收客户端进来的连接,一旦连接成功,boss线程将Channel交给其中一个worker线程来处理
2...WorkerPool<NioWorker> workerPool
work线程池:对多个Channel执行非阻塞的读写,Netty中默认为cpu核心数*2条worker线程,如果不使用worker来执行业务操作,我喜欢将worker线程数量定在cpu核心数+1,这样比较适合执行cpu密集型任务
3..NioServerSocketChannelFactory还有一个重要对象:
NioServerSocketPipelineSink sink
接收并处理下行(downstream)末端(注意下行的末端是pipeline的头结点)的ChannelEvent
2.ServerBootstrap#bind
创建一个绑定了local address的parent Channel,阻塞到绑定成功为止
1..newChannel(创建NioServerSocketChannel),传入bossPipeline、NioServerSocketChannelFactory中的sink、bossPool(如果有多个只传入一个)、workerPool
1...ServerSocketChannel.open()一个ServerSocketChannel并设置为非阻塞模式
2...bossPipeline:默认有一个Binder,主要做以下事情:
1....处理parent Channel open,负责setOptions,以及fire ChannelState.BOUND事件
2....处理child Channel open,负责setOptions
3....对bind过程中的异常进行处理
2..在NioServerSocketChannel中fireChannelOpen,由上面的Binder处理这个parent Channel open事件
parent Channel open流程:
1...设置child pipelineFactory
2...setOptions
3...fire ChannelState.BOUND downstream事件
sink#eventSunk
handleServerSocket
NioServerBoss#bind
构造NioServerBoss$RegisterTask并加入taskQueue队列
3..boss线程中(NioServerBoss.RegisterTask类中)将parent Channel向selector中注册SelectionKey.OP_ACCEPT
4..bind成功返回parent Channel
================================================================================
Accepts incoming connection
1.boss[NioServerBoss]#process中调用selector.selectedKeys()拿到OP_ACCEPT的就绪parent Channel
2.boss[NioServerBoss]#process中调用parentChannel.socket.accept()创建child Channel (acceptedSocket)
3.boss[NioServerBoss]#process#registerAcceptedChannel,接收连接
1..拿到一个worker线程
2..将child Channel、parent Channel、child pipeline、sink、worker线程、boss线程组合起来构造一个NioAcceptedSocketChannel
1...设置此Channel为连接状态
2...在parent Channel的pipeline中fire child Channel state changed(child ChannelState有OPEN和CLOSED两个状态,这里是fire child ChannelState.OPEN)
1....构造ChildChannelStateEvent
2....Binder中处理child Channel open(如上文描述,就是setOptions,比如sendBufferSize、tcpNoDelay等属性)
3...在自己的child pipeline(就是我们自己定义的pipeline了)中fire child ChannelState.OPEN
3..将构造好的NioAcceptedSocketChannel向worker中注册(也就是加入到此worker的任务队列taskQueue中)
4.切换到worker线程,向worker的Selector中注册之前boss接收并创建好的child Channel(Selectionkey.OP_READ)
================================================================================
Read
1.worker调用selector.selectedKeys()拿到OP_READ的就绪child Channel
2.NioWorker.read(SelectionKey k)
1.. 分配buffer
2.. fire MessageReceived事件
3.在child pipeline调用链中执行MessageReceived
================================================================================
Write
1.构造DownstreamMessageEvent并send downstream事件,child pipeline调用链中执行(注意downstream从pipeline队尾开始)
2.在sink中将上面的DownstreamMessageEvent offer到此Channel的writeBufferQueue
3.AbstractNioWorker#write0()
1..writeBufferQueue.poll()出上面的DownstreamMessageEvent
2..分配writeBuffer
3..buf.transferTo对应child Channel
4..fire WriteComplete事件(upstream,从pipeline头结点开始)
在child pipeline调用链中执行WriteCompletion事件(如果你使用了链路空闲检测handler,比如IdleStateHandler,会在writeComplete方法中更新lastWriteTime)
分享到:
相关推荐
一个netty的入门教程以及源码分析视频,适合刚学习的人
《Netty源码深入分析》是由美团基础架构部的闪电侠老师所分享的一系列关于Netty源码解析的视频教程。以下将根据标题、描述、标签以及部分内容等信息,对Netty及其源码进行深入剖析。 ### Netty简介 Netty是基于...
总之,Netty-4.1.97.Final源码提供了丰富的学习资源,涵盖了网络编程的各个方面,对于提升Java程序员的专业技能具有重要作用。通过深入研究源码,你将能够更好地掌握Netty的工作原理,为你的项目带来更高效、更稳定...
在本文中,我们将深入分析 Netty 4.1 源码中的 EchoServer 示例,以理解其核心组件和工作原理。 首先,我们关注 EchoServer 服务端的初始化,这涉及到两个关键组件:`bossGroup` 和 `workerGroup`。它们都是 `...
Netty的核心概念包括以下几个方面: 1. **ByteBuf**: ByteBuf是Netty中的缓冲区类,替代了Java NIO的ByteBuffer。ByteBuf提供了更高效、更安全的字节操作,并且支持读写分离,提高了性能。 2. **Channel**: ...
这个资源包含了支持 Netty 5.0.0.Alpha1 版本的源码,这是一个早期的开发版本,可能包含了一些新的特性和改进,对于开发者来说是研究和学习 Netty 进化过程的宝贵资料。 首先,让我们来了解 Netty 的核心概念和组件...
Netty 的源码分析主要包括以下几个方面: 1. **I/O 模型**:理解 Netty 如何利用 NIO 实现非阻塞 I/O,包括 Channel、Selector 和 Socket 的工作原理。 2. **Pipeline 实现**:分析 Handler 的添加、移除和调用链的...
关于Netty的核心知识点,我们可以探讨以下几个方面: 1. **NIO基础**:Netty是基于Java NIO(非阻塞I/O)构建的,这使得它能够在单个线程中处理多个连接,提高了并发性能。 2. **EventLoop和EventLoopGroup**:这...
源码分析部分可能涵盖以下几个方面: 1. **Channel**:理解Channel接口及其实现类,如何表示网络连接,并进行读写操作。 2. **Bootstrap与ServerBootstrap**:这两者是启动客户端和服务端的配置类,涉及连接建立、...
Netty源码分析可以分为三个部分:服务端创建、客户端创建和核心模块分析。服务端创建中,我们可以了解到服务端的启动过程、NioServerSocketChannel的注册过程等。客户端创建中,我们可以了解到客户端的连接过程、...
压缩包内的文件"netty源码剖析视频教程.txt"可能是课程的详细大纲或笔记,提供了对课程内容的进一步概述,包括每个章节的重点和案例分析,是学习过程中不可或缺的参考资料。通过结合视频教程和文本资料,学习者可以...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它是 Java 平台上的一个开源项目,广泛应用于分布式系统、云计算、大数据处理以及实时通信等多个领域。Netty ...
通过阅读和分析《Netty权威指南 第2版源码》,开发者不仅能了解Netty的内部工作原理,还能掌握如何根据实际需求定制和优化Netty的应用,提升网络通信的效率和稳定性。此外,源码学习也有助于深入理解Java并发编程和...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它是 Java 平台上的一个开源项目,广泛应用于分布式系统、云计算平台、游戏服务器、聊天应用以及大数据传输等...
[自己做个游戏服务器二] 游戏服务器的基石-Netty全解析,完整项目源码
总结来说,"jt808netty版解析部分源码"主要展示了如何使用Java和Netty框架来实现JT808协议的解析,涵盖了协议解析、字节操作、消息处理、异常控制等多个方面,是理解网络通信协议解析和Java并发编程的宝贵资源。
通过阅读和分析这个“netty_learn_netty_源码.zip”中的源代码,你可以深入了解Netty如何实现这些功能,以及它是如何优化网络通信效率的。此外,你还可以学习到Netty如何处理异常、优雅地关闭连接、线程安全等问题,...
1、基于netty+websocket+springboot的实时聊天系统项目源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...