Netty一般都通过bootStrap来启动, 网络动作过程就是服务器端bind->accept->read->write,客户端 connect->read->write,一般bind或者connect后会有多次read、write。依据这种特性netty将bind,accept与read,write的线程分离,connect与read、write线程分离
一、Netty主要可以分为3部分: buffer, channel, handle。
1、 Channelbuffer
l 所有的实现类中都提供,readerIndex, writerIndex两个指针,无需nio buffer的flip.
l 可以通过ChannelBufferFactory来创建channelbuffer. 分为两类buffer
HeapChannelBufferFactory: 在jvm堆上创建缓冲区,默认是BIG_ENDIAN排序
DirectChannelBufferFactory:对应nio ByteBuffer.allocateDirect(),直接缓冲区分配
l WrappedChannelBuffer实现对ChannelBuffer封装,通过其可以自定义channelbuffer.
2、 Channel:
通常每种类型的channel一般都有一个对应channelfactory类,以及一个channelconifg类。 通过channelfactory创建channel实例,然后由channelconifg来配置channel属性。
l ChannelGroup: 一组通道的集合,线程安全, 关闭的通道会自动从集合中删除, 可以通过ChannelGroup广播消息。
l Channel的种类:
LocalChannel、 LocalServerChannel:本地通道、虚拟一个网络。
DatagramChanneel: udp连接通道.
ServerSocketChannel、SoketChannel: 处理tcp/ip连接的通道。
l Channelevent: 用于将:channel的相关信息 如channel本身,传递的数据,channel的状态, future等等一起打包,在调用org.jboss.netty.channel.Channels类的各个静态的fire方式中产生,然后在channelpipe中的sendUpsteam或sendDownStream中传递。
l ChannelSink:处理pipeline中downstream结束后的事件。
3、 handler:
所有需要调用的handler都被包装成ChannelHandlerContext,注册到channelpipeline的一个map中, 通过两个指针:head和tail保证map中的handle的调用顺序。处理upstream时,通过head指针从前往后依次调用实现ChannelUpstreamHandler接口的handle. downstream处理通过tail指针,从后往前依次调用实现ChannelDownstreamHandler接口的handle。 在downsream的channelpipeline传送完后,ChannelSink的eventSunk方法完成对系统底层的调用处理。(ChannelSink和channel是通过attach的方式绑定到channelpipeline上)
Netty中已经提供的handler的种类如下:
l codec handle。包括 64位机器的编码、解码, 字符集转化,压缩,http请求编码、解码; 序列化对象的编码、解码等等。通过codec handle我们可以直接往channel中写java 对象。
l Timeout handler通过jboss.netty.util.Timer来对读写超时或者闲置链接的通知,在handle中创建一个time对象,这个time对象包含一个定时器线程Work进程,在handle第一次被触发时,启动一个Work线程:监控超时事件。
l Stream handler 用于异步处理大数据传递。通过将java.io.file对象包装成ChunkedFile对象,进行传递,ChunkedFile的底层实现是RandomAccessFile.
l Queue handler: 用户将接受到的数据或需要发送的数据先存储到一个queue队列中,然后一次性的读和写。 包括BlockingReadHandler和BufferedWriteHandler. 注意在BlockingReadHandler将receivemessage存储入queue后,其后的handler将不再处理 messageReceived,exceptionCaught 和channelClosed事件,因此BlockingReadHandler必须放在channelpipeline的最后。 同理BufferedWriteHandler。
4、 其他
l org.jboss.netty.container 各种容器的兼容 Microcontainer OSGi Spring framework 整合接口
l Bootstrap 启动类: BootStrap: TCP服务器端启动; ClientBootStrap:Tcp client端启动和ConnectionlessBootstrap UDP启动。
二、服务器的启动和客服端connect的过程
1 、服务器启动
bootstrap.bind(…)-> 触发ServerSocketChannel.open()的事件(sendupstream)->捕捉open事件,channel.bind-> Channels.bind(…) 发起bind命令(sendDownstream)-> PipelineSink进行处理-> 使用socket进行bind,启动boss进程。
Boostrap.bind 方法包含两个参数 NioServerSocketChannelFactory、ChannelPipelineFactory。NioServerSocketChannelFactory包含连个线程池bossExecutor和workerExecutor,workerExecutor: 包含缺省为处理器个数×2个NioWorker进程。
2、服务器处理连接
Boss启动后,在监听accept事件, 将捕获到的事件作为一个task放到一个niowork进程
的registerTaskQueue队列中。
3、服务器端接收并处理数据
NioWorker.run()->nioworker. processSelectedKeys()->Nioworker. Read()将从SocketChannel读取的数据封装成ChannelBuffer ->调用fireMessageReceived(channel,buffer)产生upstream事件 –> 由注册到Pipeline中的Hanlder进行处理
4、客户端connection
同服务器启动一样也需要创建一个NioClientSocketChannelFactory和一个ChannelPipelineFactory。 同服务器端不同的是client端的boss进程不要监听,它将本地发出的建立的链接的请求封装成task放入一个registerTaskQueue,boss负责消费Queue队列中的消息。
参考:
http://rdc.taobao.com/team/jm/archives/423 淘宝netty代码分析
http://www.cnblogs.com/NanguoCoffee/archive/2010/12/10/1902491.html
相关推荐
NULL 博文链接:https://bijian1013.iteye.com/blog/2340636
Netty全套学习资源(包括源码、笔记、学习文档等)
NULL 博文链接:https://bijian1013.iteye.com/blog/2340639
NULL 博文链接:https://bijian1013.iteye.com/blog/2340638
NULL 博文链接:https://bijian1013.iteye.com/blog/2340632
NULL 博文链接:https://bijian1013.iteye.com/blog/2340634
NULL 博文链接:https://bijian1013.iteye.com/blog/2340631
Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 链接 如何建造 有关构建和开发Netty的详细信息,请访问。 该页面仅提供非常基本的信息。 您需要以下内容来构建Netty...
Netty学习笔记, 包括代码学习, 源码分析.基于netty4.1, 用于记录Netty学习过程的各 种信息和心得
netty-in-action -----阅读《 Netty实战》的笔记,记录众多Netty的特性和自己的理解 netty-rpc -----使用Netty实现RPC框架(待更新) netty-small-demo -----对Netty中的众多特性,使用小的Demo讲解(待更新) 2...
读 阅读笔记 设计模式 算法 其他 尖端 算法 常用的解决方案 技术基础和基本原理
server源码@Netty 笔记 1. 内蒂 网络应用框架 特征 设计 支持多种传输类型 事件模型 高度可定制的线程模型 表现 高吞吐量,低延迟 更少的资源消耗 最小化内存拷贝 安全SSL/TLS 支持 建筑学 核 事件模型 通用通信 API...
当时我在学netty时,是从github上拉取的netty原生工程,然后在本地重新编译运行,这样我可以在源码工程中写注解,记笔记...在这个工程里面大概写了1400多行注释(所有的笔记都打上了todo高亮标记),也翻译了一些类...
NULL 博文链接:https://zisefeiniao.iteye.com/blog/385928
然后找一个demo入手,顺藤摸瓜快速静态看一遍框架的主线源码,画出源码主流程图,然后总结框架的一些核心功能点,从这些功能点入手深入到源码的细节,边看源码边画源码走向图,并对关键源码的理解做笔记,最后对所有...
源码篇 :bird: MyBatis :leaf_fluttering_in_wind: 春天 :bullet_train: 达博Dubbo原始解析-服务导出 :hammer_and_wrench: 净额 Netty原始解析正式篇-承诺Netty原始解析正式篇——ChannelPipeline和ChannelHandler ...
Java架构面试专题及架构学习笔记 Dubbo服务框架面试专题及答案整理文档 BAT面试常问80题 23种设计模式知识要点整理 面试必备—API接口安全 面试必备—服务器推送技术 面试必备—匠心独运手写MyBatis框架 面试必备—...
向下,生动清晰阐述JVM原理,内存管理,垃圾回收算法,系统调用,多线程及各种锁实现源码分析,BIO/NIO/AIO到Netty源码原理,全程项目贯穿,推动理论实践,上课等于上班,经验超过传统教学后工作一年经验,夯实的...
比较全的学习笔记;涉及内容:JVM、java集合源码、spring原理、netty、TCP网络、微服务、大数据组件:zookeeper-kafka-hbase等、大数据算法、设计模式、数据库及优化、机器学习等等
Books中存放分布式技术学习和书籍阅读后笔记、总结和一些面试搜集的问题,具体查看Books中ReadMe.md Internet中存放分布式技术等相关的学习总结 JUC中存放系列学习内容,包括系列学习总结+优秀博文搜集等 Collection...