没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
The Netty Project 3.2 User Guide
file:////D|/TDDOWNLOAD/Netty 3.2 用户手册/Netty 3.2 用户手册.html[2012/06/25 16:24:17]
Netty 3.2 用户手册
快速有效的网络应用开发
3.2.4.Final 译者:张立明 Larry Zhang
前言
1. 问题提出
2. 解决方案
1. 开始
1.1. 写在开始之前
1.2. 编写一个Discard服务
1.3. 详解Received Data
1.4. 编写一个Echo服务
1.5. 编写一个Time服务
1.6. 编写一个Time客户端
1.7. 处理基于流的传输
1.7.1. 套接字缓存(Socket Buffer)的一个小警示
1.7.2. 第一个解决办法
1.7.3. 第二个解决办法
1.8. 用POJO取代ChannelBuffer
1.9. 关闭应用程序
1.10. 总结
2. 架构概览
2.1. 丰富的缓存数据结构
2.2. 统一的异步 I/O API
2.3. 基于拦截者链(Interceptor Chain)模式的事件模型
2.4. 为更快捷开发的高级组件
2.4.1. 编码框架
2.4.2. SSL / TLS 支持
2.4.3. HTTP实现
2.4.4. Google Protocol Buffer集成
2.5. 总结
前言
The Netty Project 3.2 User Guide
file:////D|/TDDOWNLOAD/Netty 3.2 用户手册/Netty 3.2 用户手册.html[2012/06/25 16:24:17]
1. 问题提出
当前我们使用通用的应用或库来相互通信。比如,我们常常使用HTTP客户端库来从WEB服务器上获取信息,并通过Web
Service来调用一个远程过程。
然而,一个通用的协议或者它的实现,有时候并不能很好的扩展。这一点类似于我们不适用通用的HTTP服务器来交换大的文
件、电子邮件和诸如财务信息和多人游戏数据等近乎于实时的数据。这些东西需要根据其特定用途而进行高度优化的协议实
现。例如,你可能需要一个专门针对基于AJAX的聊天应用、针对多媒体流、或者大的文件传输进行了优化的HTTP服务器。
你甚至可能想设计并实现一个完全按照你的需求而定义的全新的协议。
另一种情况也是难以避免的。那就是,为了和一个既有的旧系统进行交互,你必须处理旧系统上使用的协议。这时,在不牺牲
稳定性和性能的前提下,你能够在多长时间内实现那个协议就非常重要。
2. 解决方案
Netty项目 是一个提供异步的、事件驱动的网络应用框,是一套有助于快速开发出高性能、高扩展性的、高可维护性的协议
的服务器或客户端的开发工具。
换而言之,Netty是一个基于NIO的C/S框架。这套框架可以快速、简单地开发出网络协议的客户端和服务器端应用。它可以
大大简化、流程化TCP和UDP套接字的服务器开发过程。
“快速和简单”并不意味着开发出的应用会遇到可维护性、性能等问题。Netty是建立在从许多网络协议
(如FTP、SMTP、HTTP和各种二进制和文本协议等)中借鉴的经验基础上精心设计出的。这使得Netty在开发的简单化、性
能、稳定性、灵活性等方面都同时达到了设计目标。
一些用户可能已经发现了其他的一些网络应用框架。这些框架也宣称具有相同的优势。这时你可能会问:Netty有什么不同?
答案是“道不同”。Netty设计的原则是:给你提供从API到实现以最舒适的体验。这一点是看不到摸不着的。但你在阅读这个
文档、以及应用Netty过程中,你会体验到我们的这个设计原则使得一切变得轻松容易。
Chapter 1. 开始
The Netty Project 3.2 User Guide
file:////D|/TDDOWNLOAD/Netty 3.2 用户手册/Netty 3.2 用户手册.html[2012/06/25 16:24:17]
1.1.
开始之前
1.2. 编写一个Discard服务
1.3. 详解Received Data
1.4. 编写一个Echo服务
1.5. 编写一个Time服务
1.6. 编写一个Time客户端
1.7. 处理基于流的传输
1.7.1. 套接字缓存(Socket Buffer)的一个小警示
1.7.2. 第一个解决办法
1.7.3. 第二个解决办法
1.8. 用POJO取代ChannelBuffer
1.9. 关闭你的应用程序
1.10. 总结
这一章围绕着Netty的核心构成讲述,并提供了简单的例子以便快速上手。读到本章末尾,你将可以写一个基于Netty的客户
端和服务器。
如果你喜欢自顶向下的学习方式,你应该从
Chapter 2, 架构概览 开始,然后再回到这里。
1.1. 开始之前
运行本章中的例子最低的要求只有两个:最新版本的Netty和JDK1.5或更高版本。最新的Netty可以在此
下载。 要下载到正确的JDK版本,请参考你选择的JDK提供商的网站。
在读的过程中,你会对本章中涉及的类有更多的疑问。当你想了解更多的时候,请参考API文档。所有的类名,都非常方便地
连接到了在线的API页面上。此外,记得联系我们
Netty社区 并告诉我们是否有些信息不正确,语法或者拼写等错误,或者
你有一个提高这个文档的好办法。
1.2. 编写一个Discard服务
这个世界上最简单的协议不是“Hello,World!”,而是
DISCARD。 这个协议丢弃所有的收到的数据,不给任何回应。
为了实现这个DISCARD协议,你唯一要做的事情就是忽略所有收到的数据。我们直接从处理器(handler)的实现开始。这
个处理器处理Netty生成的I/O事件。
package org.jboss.netty.example.discard;
public class DiscardServerHandler extends
SimpleChannelHandler {
@Override
The Netty Project 3.2 User Guide
file:////D|/TDDOWNLOAD/Netty 3.2 用户手册/Netty 3.2 用户手册.html[2012/06/25 16:24:17]
DiscardServerHandler继承SimpleChannelHandler, ChannelHandler的接口实现类。
SimpleChannelHandler 提供各种事件的处理方法,你可以重载它们。到目前为止,继承
SimpleChannelHandler,而不是你自己去实现一个handler接口,是足够的。
我们在这里重载了messageReceived 事件处理方法。这个方法调用时提供了MessageEvent,它包含着刚刚从客户端
收到的新数据。在这个例子中,我们通过什么也不做,来忽略收到的数据,从而实现DISCARD协议。
当一个异常因为I/O错误由Netty抛出,或者由在处理事件过程中,handler的实现抛出了异常,exceptionCaught
方法会被调用,并提供了
ExceptionEvent。 尽管在特定情况下,实现这个方法时,你需要对异常有不同的处理,但
通常情况下,被捕获的异常应该被记录,并且对应的channel应该被关闭。例如,你可能想在关闭链接之前发送一个
错误代码的回应信息。
到此为止,我们已经实现了DISCARD服务的一半。接下来需要写 main 方法来运行这个配备了 DiscardServerHandler的服
务。
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
e.getCause().printStackTrace();
Channel ch = e.getChannel();
ch.close();
}
}
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);
bootstrap.setPipelineFactory(new
ChannelPipelineFactory() {
public ChannelPipeline getPipeline() {
return
Channels.pipeline(new DiscardServerHandler());
}
});
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.bind(new InetSocketAddress(8080));
}
The Netty Project 3.2 User Guide
file:////D|/TDDOWNLOAD/Netty 3.2 用户手册/Netty 3.2 用户手册.html[2012/06/25 16:24:17]
ChannelFactory 是创建并管理 Channel和它们相关资源的工厂。它处理所有的I/O 请求,执行I/O来生
成
ChannelEvent。Netty提供多种ChannelFactory实现。我们现在正在实现一个服务器端的例子,因此我们使
用
NioServerSocketChannelFactory。另一个需要知道的是,它并不是自行创建I/O线程。它试图从你在构造方法
中指定的线程池中获得线程。对于线程是如何在你的应用运行环境中去管理的,它给了更多的控制,比如一个具有安
全管理机制的应用服务器。
ServerBootstrap是一个建立服务器的工具类。你当然可以直接使用Channel来构建一个服务器,但你要清楚这将是
一个繁琐的过程,而其实你根本没必要这么做。
这里,我们配置了ChannelPipelineFactory。当一个新的连接接入到服务器,一个新的ChannelPipeline将由指
定的
ChannelPipelineFactory来创建。这个新的Pipeline包含着DiscardServerHandler。随着这个应用逐步完
善,最终实际你就是添加更多的handler到Pipeline,并抽象出这个匿名类成为一个顶级类。
你还可以设置针对Channel实现的特定参数。我们正在编写的是TCP/IP服务,所以我们可以设置套接字的选项参
数,如tcpNoDelay 和 keepAlive。请注意到这个"child."前缀出现在所有参数前,它意味着这个选项参数应用于
接入的
Channel,而不是ServerSocketChannel的参数。你可以按下面做法来为ServerSocketChannel设定参数。
快要可以运行了。接下来要做的是绑定端口并启动服务。这里我们绑定所有本机网卡的端口8080。你可以用不同的
绑定地址来多次调用bind方法。
哈哈!我们在Netty上构建了第一个服务器应用。
1.3. 详解Received Data
刚才我们已经写了我们第一个服务器。现在需要的是测试一下它的运行情况。最简单的测试方法,莫过于使用telnet命令了。
例如,你可以在命令行上输入"telnet localhost 8080",然后随便输入些什么。
问题是,我们能说这个服务器运行正常吗?很难说的,因为它是一个“丢弃”服务,根本没有任何回应。为了证实它却是运转正
常,我们改一下这个服务,让它打印出收到的数据。
我们已经知道了,当收到了数据时,会生成
MessageEvent,还会调用messageReceived 处理器方法。我们可以在DiscardServerHandler的messageReceived中加入
代码:
}
bootstrap.setOption("reuseAddress", true);
@Override
public void messageReceived(
ChannelHandlerContext ctx, MessageEvent e) {
ChannelBuffer buf = (ChannelBuffer) e.getMessage();
while(buf.readable()) {
System.out.println((char) buf.readByte());
System.out.flush();
}
}
剩余21页未读,继续阅读
资源评论
- wx6023507692013-05-27嗯 谢谢楼主啦 一直在找中文版的呢!
- element_wm2015-09-28也不全……跟网上常见的资料没什么差异
- cietwwl2014-06-14怎么感觉不全!不过谢谢了
develop_design_level
- 粉丝: 37
- 资源: 93
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功