Netty之源代码解析
来源:互联网 发布:佣兵天下的java游戏 编辑:程序博客网 时间:2024/05/01 20:00
Netty始终要写一篇来作为终结的,但是到了写的时候才发现无从下手,了解 的还是不够吧。无奈,从四处摘录了一大片东西,很多都是官网下来的,没有什么文字说明,权当参考了。
首先来一张总体架构图,这个是从Neety官网上摘下来的,描述了Netty的核心架构和总体功能。
1. BootStrap
Bootstrap : ChannelFactory, ChannelPipeline, ChannelPipelineFactory
初始化channel的辅助类
为具体的子类提供公共数据结构
ServerBootstrap: bind()
创建服务器端channel的辅助类
接收connection请求
ClientBootstrap: connect()
创建客户端channel的辅助类
发起connection请求
ConnectionlessBootstrap: connect() , bind()
创建无连接传输channel的辅助类(UDP)
包括Client 和Server
2. Buffer
Buffer的作用在于取代nio中的java.nio.ByteBuffer,相比ByteBuffer,可以根据需要自定义buffertype。内置混合的buffertype, 以实现zero-copy。提供类似StringBuffer的动态dynamic buffer;不需要调用flip方法;推荐使用ChannelBuffers的静态工厂创建ChannelBuffer.
3. channel
org.jboss.netty.channel
channel核心api,包括异步和事件驱动等各种传送接口
org.jboss.netty.channel.group
channel group,帮助用户维护channel列表
org.jboss.netty.channel.local
一种虚拟传输方式,允许同一个虚拟机上的两个部分可以互相通信
org.jboss.netty.channel.socket
TCP, UDP接口,继承了核心的channel API
org.jboss.netty.channel.socket.nio
基于nio的Socket channel实现
org.jboss.netty.channel.socket.oio
基于老io的Socket channel实现
org.jboss.netty.channel.socket.http
基于http的客户端和相应的server端的实现,工作在有防火墙的情况
Channel的核心包结构如下图所示:
4. handler
org.jboss.netty.handler
处理器
org.jboss.netty.handler.codec
编码解码器
org.jboss.netty.handler.execution
基于Executor的实现
org.jboss.netty.handler.queue
将event存入内部队列的处理
org.jboss.netty.handler.ssl
基于SSLEngine的SSL以及TLS实现
org.jboss.netty.handler.stream
异步写入大数据,不会产生outOfMemory也不会花费很多内存
org.jboss.netty.handler.timeout
通过Timer来对读写超时或者闲置链接进行通知
5. Netty的事件模型
5.1. Netty Pipline
I/O Request
via Channel
or
ChannelHandlerContext
|
+----------------------------------------+---------------+
| ChannelPipeline | |
| \|/ |
| +----------------------+ +-----------+------------+ |
| | Upstream Handler N | | Downstream Handler 1 | |
| +----------+-----------+ +-----------+------------+ |
| /|\ | |
| | \|/ |
| +----------+-----------+ +-----------+------------+ |
| | Upstream Handler N-1 | | Downstream Handler 2 | |
| +----------+-----------+ +-----------+------------+ |
| /|\ . |
| . . |
| [ sendUpstream() ] [ sendDownstream() ] |
| [ + INBOUND data ] [ + OUTBOUND data ] |
| . . |
| . \|/ |
| +----------+-----------+ +-----------+------------+ |
| | Upstream Handler 2 | | Downstream Handler M-1 | |
| +----------+-----------+ +-----------+------------+ |
| /|\ | |
| | \|/ |
| +----------+-----------+ +-----------+------------+ |
| | Upstream Handler 1 | | Downstream Handler M | |
| +----------+-----------+ +-----------+------------+ |
| /|\ | |
+-------------+--------------------------+---------------+
| \|/
+-------------+--------------------------+---------------+
| | | |
| [ Socket.read() ] [ Socket.write() ] |
| |
| Netty Internal I/O Threads (Transport Implementation) |
+--------------------------------------------------------+
处理方式:
ChannelPipelinep = Channels.pipeline();
p.addLast("1", newUpstreamHandlerA());
p.addLast("2", newUpstreamHandlerB());
p.addLast("3", newDownstreamHandlerA());
p.addLast("4", newDownstreamHandlerB());
p.addLast("5", newUpstreamHandlerX());
Upstream: 1 –> 2 –> 5 顺序处理
Downstream: 4 –> 3 逆序处理
5.2. ChannelState
Direction
State
Value
Meaning
Upstream
OPEN
true
The channel is open.
Upstream
OPEN
false
The channel is closed.
Upstream
BOUND
SocketAddress
The channel is bound to a local address.
Upstream
BOUND
null
The channel is unbound to a local address.
Upstream
CONNECTED
SocketAddress
The channel is connected to a remote address.
Upstream
CONNECTED
null
The channel is disconnected from a remote address.
Upstream
INTEREST_OPS
an integer
The channel interestOps has been changed.
Downstream
OPEN
true
N/A
Downstream
OPEN
false
Close the channel.
Downstream
BOUND
SocketAddress
Bind the channel to the specified local address.
Downstream
BOUND
null
Unbind the channel from the current local address.
Downstream
CONNECTED
SocketAddress
Connect the channel to the specified remote address.
Downstream
CONNECTED
null
Disconnect the channel from the current remote address.
Downstream
INTEREST_OPS
an integer
Change the interestOps of the channel.
5.3. Upstreamevents
Event name
Event type and condition
Meaning
"messageReceived"
MessageEvent
a message object (e.g. ChannelBuffer) was received from a remote peer
"exceptionCaught"
ExceptionEvent
an exception was raised by an I/O thread or a ChannelHandler
"channelOpen"
ChannelStateEvent
(state = OPEN, value = true)
a Channel is open, but not bound nor connected
"channelClosed"
ChannelStateEvent
(state = OPEN, value = false)
a Channel was closed and all its related resources were released
"channelBound"
ChannelStateEvent
(state = BOUND, value = SocketAddress)
a Channel is open and bound to a local address, but not connected
"channelUnbound"
ChannelStateEvent
(state = BOUND, value = null)
a Channel was unbound from the current local address
"channelConnected"
ChannelStateEvent
(state = CONNECTED, value =SocketAddress)
a Channel is open, bound to a local address, and connected to a remote address
"writeComplete"
WriteCompletionEvent
something has been written to a remote peer
"channelDisconnected"
ChannelStateEvent
(state = CONNECTED, value = null)
a Channel was disconnected from its remote peer
"channelInterestChanged"
ChannelStateEvent
(state = INTEREST_OPS, no value)
a Channel's interestOps was changed
5.4. Downstreamevents
Event name
Event type and condition
Meaning
"write"
MessageEvent
Send a message to the Channel.
"bind"
ChannelStateEvent
(state = BOUND, value = SocketAddress)
Bind the Channel to the specified local address.
"unbind"
ChannelStateEvent
(state = BOUND, value = null)
Unbind the Channel from the current local address.
"connect"
ChannelStateEvent
(state = CONNECTED, value = SocketAddress)
Connect the Channel to the specified remote address.
"disconnect"
ChannelStateEvent
(state = CONNECTED, value = null)
Disconnect the Channel from the current remote address.
"close"
ChannelStateEvent
(state = OPEN, value = false)
Close the Channel.
6. Netty VS Mina
Netty基于Pipeline处理,Mina基于Filter过滤
Netty的事件驱动模型具有更好的扩展性和易用性
Https,SSL,PB,RSTP,Text&Binary等协议支持
Netty中UDP传输有更好的支持
官方测试Netty比Mina性能更好
- Netty之源代码解析
- Netty之源代码解析
- Netty之源代码解析
- Netty之源代码解析
- Netty源代码之FrameDecoder
- Netty之Channel源代码分析
- Netty解析
- netty解析
- Apache源代码解析之MIME
- Apache源代码解析之主程序
- Apache源代码解析之概述
- Apache源代码解析之前言
- lcc源代码解析之interface
- Ffmpeg源代码解析之av_read_frame
- Netty源代码阅读
- netty源码分析之服务端启动全解析
- 【Netty】Netty系列之Netty可靠性分析
- 【Netty】Netty系列之Netty线程模型
- js只能输入数字及小数点
- 关于WCF+MVC+EF 学习系列文章整理
- 《离散数学及其应用》读书笔记-二分法
- UIPickerView 实现多列选择栏
- 依赖项注入 (DI) 和控制反转 (IOC) 容器模型
- Netty之源代码解析
- 常用类型 总结
- Shell Perl Python 脚本语言介绍
- android翻书效果实现原理( 贝塞尔曲线绘制原理/点坐标计算)
- UIWebView 控制页面 字体 大小
- Finding a needle in Haystack:Facebook's photo storage的理解
- UIScrollView 实现 重用机制 dome
- eclipse或者myeclipse的Help菜单下找不到SoftWare Updates菜单的解决
- IsBadReadPtr