资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
JBoss.org: Netty - The Client Server Framework and ToolsCommunity DocumentationNetty 3.2 用户手册快速有效的网络应用开发前言1. 问题提出2. 解决方案1. 开始1.1. 写在开始之前1.2. 编写一个Discard服务1.3. 详解Received Data1.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 API2.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. 总结前言1.问题提出当前我们使用通用的应用或库来相互通信。比如,我们常常使用HTTP客户端库来从WEB服务器上获取信息,并通过Web Service来调用一个远程过程。 然而,一个通用的协议或者它的实现,有时候并不能很好的扩展。这一点类似于我们不适用通用的HTTP服务器来交换大的文件、电子邮件和诸如财务信息和多人游戏数据等近乎于实时的数据。这些东西需要根据其特定用途而进行高度优化的协议实现。例如,你可能需要一个专门针对基于AJAX的聊天应用、针对多媒体流、或者大的文件传输进行了优化的HTTP服务器。你甚至可能想设计并实现一个完全按照你的需求而定义的全新的协议。 另一种情况也是难以避免的。那就是,为了和一个既有的旧系统进行交互,你必须处理旧系统上使用的协议。这时,在不牺牲稳定性和性能的前提下,你能够在多长时间内实现那个协议就非常重要。 2.解决方案Netty项目 是一个提供异步的、事件驱动的网络应用框,是一套有助于快速开发出高性能、高扩展性的、高可维护性的协议的服务器或客户端的开发工具。 换而言之,Netty是一个基于NIO的C/S框架。这套框架可以快速、简单地开发出网络协议的客户端和服务器端应用。它可以大大简化、流程化TCP和UDP套接字的服务器开发过程。 “快速和简单”并不意味着开发出的应用会遇到可维护性、性能等问题。Netty是建立在从许多网络协议(如FTP、SMTP、HTTP和各种二进制和文本协议等)中借鉴的经验基础上精心设计出的。这使得Netty在开发的简单化、性能、稳定性、灵活性等方面都同时达到了设计目标。 一些用户可能已经发现了其他的一些网络应用框架。这些框架也宣称具有相同的优势。这时你可能会问:Neey有什么不同?答案是“道不同”。Netty设计的原则是:给你提供从API到实现以最舒适的体验。这一点是看不到摸不着的。但你在阅读这个文档、以及应用Netty过程中,你会体验到我们的这个设计原则使得一切变得轻松容易。 Chapter1.开始1.1. 开始之前1.2. 编写一个Discard服务1.3. 详解Received Data1.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. 总结 这一章围绕着Neey的核心构成讲述,并提供了简单的例子以便快速上手。读到本章末尾,你将可以写一个基于Netty的客户端和服务器。 如果你喜欢自顶向下的学习方式,你应该从 Chapter2, 架构概览 开始,然后再回到这里。 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 public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) e.getCause().printStackTrace(); Channel ch = e.getChannel(); ch.close(); DiscardServerHandler继承SimpleChannelHandler, ChannelHandler的接口实现类。 SimpleChannelHandler 提供各种事件的处理方法,你可以重载它们。到目前为止,继承 SimpleChannelHandler,而不是你自己去实现一个handler接口,是足够的。 我们在这里重载了messageReceived 事件处理方法。这个方法调用时提供了MessageEvent,它包含着刚刚从客户端收到的新数据。在这个例子中,我们通过什么也不做,来忽略收到的数据,从而实现DISCARD协议。当一个异常因为I/O错误由Netty抛出,或者由在处理事件过程中,handler的实现抛出了异常,exceptionCaught 方法会被调用,并提供了ExceptionEvent。 尽管在特定情况下,实现这个方法时,你需要对异常有不同的处理,但通常情况下,被捕获的异常应该被记录,并且对应的channel应该被关闭。例如,你可能想在关闭链接之前发送一个错误代码的回应信息。 到此为止,我们已经实现了DISCARD服务的一半。接下来需要写 main 方法来运行这个配备了 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); 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); 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设定参数。bootstrap.setOption(reuseAddress, true);快要可以运行了。接下来要做的是绑定端口并启动服务。这里我们绑定所有本机网卡的端口8080。你可以用不同的绑定地址来多次调用bind方法。哈哈!我们在Netty上构建了第一个服务器应用。1.3.详解Received Data刚才我们已经写了我们第一个服务器。现在需要的是测试一下它的运行情况。最简单的测试方
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号