设为首页 加入收藏

TOP

Netty源码学习笔记
2014-11-24 02:50:53 来源: 作者: 【 】 浏览:2
Tags:Netty 源码 学习 笔记

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


所有的实现类中都提供,readerIndex, writerIndex两个指针,无需nio buffer的flip.


可以通过ChannelBufferFactory来创建channelbuffer. 分为两类buffer


HeapChannelBufferFactory: 在jvm堆上创建缓冲区,默认是BIG_ENDIAN排序


DirectChannelBufferFactory:对应nio ByteBuffer.allocateDirect(),直接缓冲区分配


WrappedChannelBuffer实现对ChannelBuffer封装,通过其可以自定义channelbuffer.


2、 Channel:


通常每种类型的channel一般都有一个对应channelfactory类,以及一个channelconifg类。 通过channelfactory创建channel实例,然后由channelconifg来配置channel属性。


ChannelGroup: 一组通道的集合,线程安全, 关闭的通道会自动从集合中删除, 可以通过ChannelGroup广播消息。


Channel的种类:


LocalChannel、 LocalServerChannel:本地通道、虚拟一个网络。


DatagramChanneel: udp连接通道.


ServerSocketChannel、SoketChannel: 处理tcp/ip连接的通道。


Channelevent: 用于将:channel的相关信息 如channel本身,传递的数据,channel的状态, future等等一起打包,在调用org.jboss.netty.channel.Channels类的各个静态的fire方式中产生,然后在channelpipe中的sendUpsteam或sendDownStream中传递。


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的种类如下:


codec handle。包括 64位机器的编码、解码, 字符集转化,压缩,http请求编码、解码; 序列化对象的编码、解码等等。 通过codec handle我们可以直接往channel中写java 对象。


Timeout handler通过jboss.netty.util.Timer来对读写超时或者闲置链接的通知,在handle中创建一个time对象,这个time对象包含一个定时器线程Work进程,在handle第一次被触发时,启动一个Work线程:监控超时事件。


Stream handler 用于异步处理大数据传递。通过将java.io.file对象包装成ChunkedFile对象,进行传递,ChunkedFile的底层实现是RandomAccessFile.


Queue handler: 用户将接受到的数据或需要发送的数据先存储到一个queue队列中,然后一次性的读和写。 包括 BlockingReadHandler和BufferedWriteHandler. 注意在BlockingReadHandler将receivemessage存储入queue后,其后的handler将不再处理 messageReceived,exceptionCaught 和channelClosed事件,因此BlockingReadHandler必须放在channelpipeline的最后。 同理BufferedWriteHandler。


4、 其他


org.jboss.netty.container 各种容器的兼容 Microcontainer OSGi Spring framework 整合接口


Bootstrap 启动类: BootStrap: TCP服务器端启动; ClientBootStrap:Tcp client端启动和ConnectionlessBootstrap UDP启动。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python 正则模块的应用 下一篇Netty使用实例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: