没有合适的资源?快使用搜索试试~ 我知道了~
netty中文指南.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 104 浏览量
2021-09-13
17:11:35
上传
评论
收藏 1.05MB DOCX 举报
温馨提示
试读
28页
。。。
资源推荐
资源详情
资源评论
uml.org.cn
Netty 中文介绍
1. 问题
现在,我们使用适合一般用途的应用或组件来和彼此通信。例如,我们常常使用一个HTTP
客户端从远程服务器获取信息或者通过 web services 进行远程方法的调用。
然而,一个适合普通目的的协议或其实现并不具备其规模上的扩展性。例如,我们无法使用
一个普通的 HTTP 服务器进行大型文件,电邮信息的交互,或者 处理金融信息和多人游戏
数据那种要求准实时消息传递的应用场景。因此,这些都要求使用一个适用于特殊目的并经
过高度优化的协议实现。例如,你可能想要实现 一个对基于 AJAX 的聊天应用,媒体流或
大文件传输进行过特殊优化的 HTTP 服务器。你甚至可能想去设计和实现一个全新的,特
定于你的需求的通信协议。
另一种无法避免的场景是你可能不得不使用一种专有的协议和原有系统交互。在这种情况
下,你需要考虑的是如何能够快速的开发出这个协议的实现并且同时还没有牺牲最终应用的
性能和稳定性。
2. 方案
Netty 是一个异步的,事件驱动的网络编程框架和工具,使用 Netty 可以快速开发出可维护
的,高性能、高扩展能力的协议服务及其客户端应用。
也就是说,Netty 是一个基于 NIO 的客户,服务器端编程框架,使用 Netty 可以确保你快
速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty 相当简
化和流线化了网络应用的编程开发过程,例如,TCP 和 UDP 的 socket 服务开发。
“快速”和“简单”并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸
收了多种协议的实现经验,这些协议包括 FTP,SMPT,HTTP,各种二进制,文本协议,并
经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还
保证了其应用的性能,稳定性和伸缩性。
一些用户可能找到了某些同样声称具有这些特性的编程框架,因此你们可能想问Netty 又
有什么不一样的地方。这个问题的答案是 Netty 项目的设计哲学。从创立之初,无论是在
API 还是在其实现上 Netty 都致力于为你提供最为舒适的使用体验。虽然这并不是显而易见
的,但你终将会认识到这种设计哲学将令你在阅读本指南和使用Netty 时变得更加得轻松
和容易。
uml.org.cn
第一章. 开始
这一章节将围绕Netty的核心结构展开,同时通过一些简单的例子可以让你更快的了解Netty
的使用。当你读完本章,你将有能力使用 Netty 完成客户端和服务端的开发。
如果你更喜欢自上而下式的学习方式,你可以首先完成 第二章:架构总览 的学习,然后再
回到这里。
1.1. 开始之前
运行本章示例程序的两个最低要求是:最新版本的 Netty 程序以及 JDK 1.5 或更高版本。最
新版本的 Netty 程序可在项目下载页 下载。下载正确版本的 JDK,请到你偏好的 JDK 站点
下载。
这就已经足够了吗?实际上你会发现,这两个条件已经足够你完成任何协议的开发了。如果
不是这样,请联系 Netty 项目社区 ,让我们知道还缺少了什么。
最终但不是至少,当你想了解本章所介绍的类的更多信息时请参考API 手册。为方便你的
使用,这篇文档中所有的类名均连接至在线API 手册。此外,如 果本篇文档中有任何错误
信息,无论是语法错误,还是打印排版错误或者你有更好的建议,请不要顾虑,立即联系
Netty 项目社区 。
1.2. 抛弃协议服务
在这个世界上最简化的协议不是“Hello,worl而d!是”抛弃协议 。这是一种丢弃接收到的任何
数据并不做任何回应的协议。
实现抛弃协议(DISCARD protocol),你仅需要忽略接受到的任何数据即可。让我们直接
从处理器(handler)实现开始,这个处理器处理 Netty 的所有 I/O 事件。
package org.jboss.netty.example.discard;
@ChannelPipelineCoverage("all")1
public class DiscardServerHandler extends SimpleChannelHandler {2
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {3
}
@Override
uml.org.cn
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {4
e.getCause().printStackTrace();
Channel ch = e.getChannel();
ch.close();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {4
e.getCause().printStackTrace();
Channel ch = e.getChannel();
ch.close();
}
}
代码说明
1)ChannelPipelineCoverage 注解了一种处理器类型,这个注解标示了一个处理器是否可被
多个 Channel 通道共享(同时关 联着 ChannelPipeline)。DiscardServerHandler 没有处
理任何有状态的信息,因此这里的注解是“al。l”
2)DiscardServerHandler 继承了 SimpleChannelHandler,这也是一个 ChannelHandler 的
实现。SimpleChannelHandler 提供了多种你可以重写的事件处理方法。目前直接继承
SimpleChannelHandler 已经足够 了,并不需要你完成一个自己的处理器接口。
3)我们这里重写了 messageReceived 事件处理方法。这个方法由一个接收了客户端传送数
据的 MessageEvent 事件调用。在这个例子中,我们忽略接收到的任何数据,并以此来实
现一个抛弃协议(DISCARD protocol)。
4)exceptionCaught 事件处理方法由一个 ExceptionEvent 异常事件调用,这个异常事件起
因于 Netty 的 I/O 异常或一个处理器实现的内部异常。多数情况下,捕捉 到的异常应当被
记录下来,并在这个方法中关闭这个 channel 通道。当然处理这种异常情况的方法实现可能
因你的实际需求而有所不同,例如,在关闭这个连 接之前你可能会发送一个包含了错误码
的响应消息。
uml.org.cn
目前进展不错,我们已经完成了抛弃协议服务器的一半开发工作。下面要做的是完成一个可
以启动这个包含 DiscardServerHandler 处理器服务的主方法。
package org.jboss.netty.example.discard;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
public class DiscardServer {
public static void main(String[] args) throws Exception {
ChannelFactory factory =
new NioServerSocketChannelFactory (
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
ServerBootstrap bootstrap = new ServerBootstrap (factory);
DiscardServerHandler handler = new DiscardServerHandler();
ChannelPipeline pipeline = bootstrap.getPipeline();
pipeline.addLast("handler", handler);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.bind(new InetSocketAddress(8080));
}
uml.org.cn
}
代码说明
1)ChannelFactory 是一个创建和管理 Channel 通道及其相关资源的工厂接口,它处理所有
的 I/O 请求并产生相应的 I/O ChannelEvent 通道事件。Netty 提供了多种 ChannelFactory
实现。这里我们需要实现一个服务端的例子,因此我们使用
NioServerSocketChannelFactory 实现。另一件需要注意的事情是这个工 厂并自己不负责
创建 I/O 线程。你应当在其构造器中指定该工厂使用的线程池,这样做的好处是你获得了更
高的控制力来管理你的应用环境中使用的线程,例如一 个包含了安全管理的应用服务。
2)ServerBootstrap 是一个设置服务的帮助类。你甚至可以在这个服务中直接设置一个
Channel 通道。然而请注意,这是一个繁琐的过程,大多数情况下并不需要这样做。
3)这里,我们将 DiscardServerHandler 处理器添加至默认的 ChannelPipeline 通道。任何时
候当服务器接收到一个新 的连接,一个新的 ChannelPipeline 管道对象将被创建,并且所
有在这里添加的 ChannelHandler 对象将被添加至这个新的 ChannelPipeline 管道对象。这
很像是一种浅拷贝操作(a shallow-copy operation);所有的 Channel 通道以及其对应的
ChannelPipeline 实例将分享相同的 DiscardServerHandler 实例。
4)你也可以设置我们在这里指定的这个通道实现的配置参数。我们正在写的是一个TCP/IP
服务,因此我们运行设定一些 socket 选项,例如 tcpNoDelay 和 keepAlive。请注意我们在
配置选项里添加的"child."前缀。这意味着这个配置项仅适用于我们接收到的通道实例,而不
是 ServerSocketChannel 实例。因此,你可以这样给一个 ServerSocketChannel 设定参数:
bootstrap.setOption("reuseAddress", true);
5)我们继续。剩下要做的是绑定这个服务使用的端口并且启动这个服务。这里,我们绑定本
机所有网卡(NICs,network interface cards)上的 8080 端口。当然,你现在也可以对应不
同的绑定地址多次调用绑定操作。
大功告成!现在你已经完成你的第一个基于Netty 的服务端程序。
1.3. 查看接收到的数据
现在你已经完成了你的第一个服务端程序,我们需要测试它是否可以真正的工作。最简单的
方法是使用 telnet 命令。例如,你可以在命令行中输入“telnet localhost 80或80其”他类型
参数。
然而,我们可以认为服务器在正常工作吗?由于这是一个丢球协议服务,所以实际上我们无
法真正的知道。你最终将收不到任何回应。为了证明它在真正的工作,让我们修改代码打印
其接收到的数据。
我们已经知道当完成数据的接收后将产生 MessageEvent 消息事件,并且也会触发
messageReceived 处理方法。所以让我在 DiscardServerHandler 处理器的
messageReceived 方法内增加一些代码。
@Override
剩余27页未读,继续阅读
资源评论
苦茶子12138
- 粉丝: 1w+
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功