- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Netty 代码分析
Netty 代码分析
Posted by bucketli on 2010-09-25 Leave a comment (1) Go to comments
Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、
高可靠性的网络服务器和客户端程序[官方定义],整体来看其包含了以下内容:
1.提供了丰富的协议编解码支持,2.实现自有的 buffer 系统,减少复制所带来
的消耗,3.整套 channel 的实现,4.基于事件的过程流转以及完整的网络事件响
应与扩展,5.丰富的 example。本文并不对 Netty 实际使用中可能出现的问题做
分析,只是从代码角度分析它的架构以及实现上的一些关键细节。
首先来看下最如何使用 Netty(其自带 example 很好展示了使用),Netty 普通使
用一般是通过 BootStrap 来启动,BootStrap 主要分为两类:1.面向连接(TCP)
的 BootStrap(ClientBootStrap 和 ServerBootstrap),2.非面向连接(UDP) 的
(ConnectionlessBootstrap)。
Netty 整体架构很清晰的分成 2个部分,ChannelFactory 和
ChannelPipelineFactory,前者主要生产网络通信相关的 Channel 实例和
ChannelSink 实例,Netty 提供的 ChannelFactory 实现基本能够满足绝大部分
用户的需求,当然你也可以定制自己的 ChannelFactory,后者主要关注于具体传
输数据的处理,同时也包括其他方面的内容,比如异常处理等等,只要是你希望
的,你都可以往里添加相应的 handler,一般 ChannelPipelineFactory 由用户自
己实现,因为传输数据的处理及其他操作和业务关联比较紧密,需要自定义处理
的 handler。
现在,使用 Netty 的步骤实际上已经非常明确了,比如面向连接的 Netty 服务端
客户端使用,第一步:实例化一个 BootStrap,并且通过构造方法指定一个
ChannelFactory 实现,第二步:向 bootstrap 实例注册一个自己实现的
ChannelPipelineFactory,第三步:如果是服务器端,bootstrap.bind(new
InetSocketAddress(port)),然后等待客户端来连接,如果是客户端,
bootstrap.connect(new InetSocketAddress(host,port))取得一个 future,这
个时候 Netty 会去连接远程主机,在连接完成后,会发起类型为 CONNECTED 的
ChannelStateEvent,并且开始在你自定义的 Pipeline 里面流转,如果你注册的
handler 有这个事件的响应方法的话那么就会调用到这个方法。在此之后就是数
据的传输了。下面是一个简单客户端的代码解读。
// 实例化一个客户端 Bootstrap 实例,其中 NioClientSocketChannelFactory
实例由 Netty 提供
ClientBootstrap bootstrap = new ClientBootstrap(
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
// 设置 PipelineFactory,由客户端自己实现
bootstrap.setPipelineFactory(new
FactorialClientPipelineFactory(count));
//向目标地址发起一个连接
ChannelFuture connectFuture =
bootstrap.connect(new InetSocketAddress(host, port));
// 等待链接成功,成功后发起的 connected 事件将会使 handler 开始
发送信息并且等待 messageRecive,当然这只是示例。
Channel channel =
connectFuture.awaitUninterruptibly().getChannel();
// 得到用户自定义的 handler
FactorialClientHandler handler =
(FactorialClientHandler) channel.getPipeline().getLast();
// 从 handler 里面取数据并且打印,这里需要注意的是,
handler.getF
您可能关注的文档
- LP133WH2-TLA2.pdf
- logistics02.ppt
- LP141WP2-TPA1.pdf
- Lord of the Flies 蝇王.pdf
- LP156WH4-TLN2.pdf
- LPC21XX系列寄存器大全.pdf
- LPR Videolaringoscopy.pdf
- LP156WH3-TPSH_Final_CAS_V1.0_.pdf
- LTA320AP02.pdf
- LTE-A CA introduction-V1.0.pdf
- 衢州、丽水、湖州2025 年 4 月三地市高三教学质量检测试题分析.pptx
- 新和成控股集团有限公司校园招聘85人公开引进高层次人才和急需紧缺人才笔试参考题库答案详解版及参考答案.docx
- 新疆维吾尔自治区石油管理局校园招聘85人公开引进高层次人才和急需紧缺人才笔试参考题库答案详解版学生专.docx
- 新和成控股集团有限公司校园招聘模拟试题附带答案详解及参考答案1套.docx
- 新疆维吾尔自治区石油管理局校园招聘85人公开引进高层次人才和急需紧缺人才笔试参考题库答案详解版审定版.docx
- 第02讲 社会评价的内容.pdf
- 2024年一建《建筑》大V精讲总讲义【在线版】.pdf
- 2025年社会工作者之中级社会工作法规与政策综合检测试卷A卷含答案.docx
- 2022-2025年执业药师之中药学综合知识与技能综合检测试卷A卷含答案.docx
- 2022-2025年执业药师之西药学综合知识与技能综合练习试卷B卷附答案.docx
文档评论(0)