本书是讲述RMI技术的经典著作,清晰地展示了设计和创建RMI应用中涉及到的思想,包括最常用的设计模式。详细讲述了如何利用RMI的所有高级特性,如何创建RMI系统,实例丰富,还介绍了常用的客户/服务器结构、远程调用的本质以及与RMI相关的技术。作者把既简单又很有说服力的应用与理论相结合,全书由浅入深,概念叙述和应用分析并举,使读者不仅“知其然”,而且“知其所以然”。对于所有关注Java技术、从事企业应用实现的读者来说,是一本内容详尽、技巧高超的参考书籍。
译者序\r\n前言\r\n\r\n第一部分 基本原理和结构\r\n\r\n第1章 客户/服务器结构 \r\n\r\n1.1 客户/服务器基础 \r\n1.1.1 客户和服务器的定义 \r\n1.1.2 为什么使用客户/服务器结构 \r\n1.1.3 n层系统 \r\n1.2 网络化计算基础 \r\n1.2.1 网络通信 \r\n1.2.2 编组 \r\n1.2.3 代理 \r\n1.2.4 命名 \r\n1.3 其他类型的客户/服务器系统 \r\n1.3.1 万维网 \r\n1.3.2 远程过程调用 \r\n1.3.3 CORBA \r\n1.4 小结 \r\n\r\n第2章 远程方法调用的本质 \r\n\r\n2.1 什么是RMI \r\n2.1.1 RMI不能进行的工作 \r\n2.1.2 RMI原理 \r\n2.1.3 RMI与普通Java的区别 \r\n2.2 RMI/JRMP结构 \r\n2.2.1 存根 \r\n2.2.2 编组 \r\n2.2.3 RMI线程和网络连接管理 \r\n2.2.4 分布式垃圾收集 \r\n2.2.5 命名 \r\n2.3 小结 \r\n\r\n第二部分 建立RMI应用\r\n\r\n第3章 HelloWorld应用 \r\n\r\n3.1 应用综述 \r\n3.2 远程接口 \r\n3.3 服务器 \r\n3.3.1 远程对象 \r\n3.3.2 管理器 \r\n3.4 客户 \r\n3.5 远程调用 \r\n3.6 应用 \r\n3.6.1 封装\r\n3.6.2 启用命名服务\r\n3.6.3 启动服务器 \r\n3.6.4 启动客户 \r\n3.7 小结 \r\n\r\n第4章 改进HelloWorld示例 \r\n\r\n4.1 改进后的应用综述 \r\n4.2 服务器 \r\n4.2.1 远程对象 \r\n4.2.2 管理器 \r\n4.3 客户 \r\n4.4 应用 \r\n4.4.1 封装\r\n4.4.2 启动服务器 \r\n4.4.3 启动客户 \r\n4.5 小结 \r\n\r\n第5章 自定义连接管理 \r\n\r\n5.1 自定义连接管理综述 \r\n5.2 RMIServerSocketFactory接口 \r\n5.3 RMIClientSocketFactory接口 \r\n5.4 一个简单的连接工厂 \r\n5.4.1 IdentityServerSocketFactory类 \r\n5.4.2 IdentityClientSocketFactory类 \r\n5.4.3 IdentityServerSocket类 \r\n5.4.4 IdentitySocket类 \r\n5.5 使用自定义连接工厂 \r\n5.6 小结 \r\n\r\n第6章 激活 \r\n\r\n6.1 激活综述 \r\n6.1.1 激活组 \r\n6.1.2 可激活 \r\n6.2 激活示例 \r\n6.2.1 Setup类\r\n6.2.2 服务器类\r\n6.2.3 客户类 \r\n6.2.4 运行示例\r\n6.3 小结 \r\n\r\n第三部分 创建真正的应用\r\n\r\n第7章 开发一个聊天应用 \r\n\r\n7.1 聊天设计综述 \r\n7.1.1 TopicServer远程接口 \r\n7.1.2 Topic远程接口 \r\n7.1.3 MessageListener远程接口 \r\n7.1.4 ListenerInfo类 \r\n7.1.5 TopicInfo类 \r\n7.1.6 Message类 \r\n7.1.7 Listener类\r\n7.1.8 TopicServerImpl类 \r\n7.1.9 MessageQueue类 \r\n7.1.10 Worker类 \r\n7.1.11 Main类 \r\n7.1.12 ChatClient类 \r\n7.1.13 ChatGUI类 \r\n7.2 小结 \r\n\r\n第8章 开发移动代理应用 \r\n\r\n8.1 移动代理设计综述 \r\n8.2 代理接口类 \r\n8.2.1 AgentHost接口 \r\n8.2.2 NoSuchAgentException异常 \r\n8.2.3 Agent接口 \r\n8.3 代理主机实现\r\n8.3.1 AgentHostImpl类\r\n8.3.2 Main类 \r\n8.4 移动代理实现 \r\n8.4.1 HelloAgent接口 \r\n8.4.2 HelloAgentImpl类\r\n8.5 代理客户实现 \r\n8.6 代理管理器实现\r\n8.7 小结 \r\n\r\n第四部分 高级应用\r\n\r\n第9章 RMI和Jini \r\n\r\n9.1 综述 \r\n9.1.1 发现\r\n9.1.2 查找\r\n9.1.3 租借\r\n9.1.4 远程事件 \r\n9.1.5 事务处理 \r\n9.2 HelloJini示例综述 \r\n9.3 HelloJini服务 \r\n9.4 HelloJini客户 \r\n9.5 运行HelloJini示例 \r\n9.6 小结 \r\n\r\n第10章 RMI和Enterprise JavaBeans \r\n\r\n10.1 综述 \r\n10.1.1 EJB容器 \r\n10.1.2 EJB组件 \r\n10.1.3 无状态会话bean \r\n10.1.4 有状态会话bean \r\n10.1.5 实体bean \r\n10.2 HelloEJB示例综述 \r\n10.3 HelloEJB组件 \r\n10.3.1 HelloEJB Home接口 \r\n10.3.2 HelloEJB 远程接口 \r\n10.3.3 HelloEJB Bean实现 \r\n10.3.4 HelloEJB 配置描述文件 \r\n10.4 HelloEJB客户 \r\n10.5 小结 \r\n\r\n附录 更多阅读材料 \r\n光盘内容简介
本书是一本有关RMI(Remote Method Invocation,远程方法调用)的指南。本书将向读者展示设计和创建RMI应用中涉及到的思想,包括最常用的设计模式。它将教读者如何利用RMI的所有高级特性,并在如何创建RMI系统方面举出了很多例子。它还将展示RMI与建立在其上的其他技术之间的联系。读完这本书后,就会知道如何在自己的工作中更好地使用RMI。更为重要的是,读者将不仅知道要做什么,还会知道为什么应该那样做(知道为什么应该用某种方法做某些事是很重要的,其中包括RMI)。
总的来说,分布式计算相当复杂,尤其是RMI。它们涉及到很多东西,使得它们比其他的Java编程更加困难。虽然本书的目标是使RMI编程不再像以前那么复杂,但应该认识到其内部的复杂性。本书将从一开始就声明这一点,因此除了Java的一些知识外,在阅读本书时,不需要知道其他的任何东西。我们推荐读者应该首先了解一些网络及其相关原理,但这不是必须的。
虽然RMI本身就是非常有用的,但当用其他技术实现时,其功能会更加强大。本书中用到了相当多这样的技术,在阅读本书的时候读者很可能会想要下载和读取这些技术的说明。在本书最后的附录中提供了这些说明的出处。相关的Web站点上也包含了这些说明和技术的链接。
本书内容
本书共分为四部分:
第一部分介绍客户/服务器(Client/Server)结构。第1章将给客户和服务器下定义并看一下n层系统的思想。此后,将讨论在一般情况下创建远程方法调用机制所需要的准备工作,以及它要处理的问题。随后,将看几个使用目前这种客户/服务器结构的例子,并分析一下它们是如何解决定义的问题的。第2章是RMI结构的速成班教程。该章将遍历RMI的整个设计过程,并看一下它是如何实现必须注意的任务的。还将讨论RMI实现的几个内部因素,比如线程、序列化和动态类加载(classloading),从而可以使得在使用RMI的时候,对它内部发生的情况有一个清楚的认识。这两章为读者应用其他章节的内容提供了坚实的基础。经验丰富的读者可能想跳过第1章。然而,建议所有读者至少应该浏览一下第2章的提示和警告部分,因为它们含有很多有趣的提示和技巧。
第二部分将引导读者完成基本RMI应用的创建过程。在第3章一开始就创建一个简单的HelloWorld示例,用来展示RMI应用所需要的最少步骤。接下来讲述如何设置应用的结构以便于打包和配置。还介绍一个从客户到服务器再从服务器到客户的调用。这将使读者对RMI调用流有一个清楚的印象,这是理解一般RMI的一个很重要的因素。第4章继续第2章的HelloWorld示例,并对它进行了扩充,把原来的客户变为一个applet,使用Web服务器的动态类加载功能,并借助Java命名及目录接口(Java Naming and Directory Interface,JNDI),使用标准化的命名API把命名服务隐藏起来。具有RMI经验的读者可以跳过第3章直接进入第4章,但是对RMI不熟悉的读者应该阅读这两章的内容。
第三部分讲述的是RMI的一些更高级的特性。仍将继续使用本书的前面章节所举的HelloWorld示例,然后由每一章展示一些特性来增强这一示例。所描述的特性是自定义连接管理(又名自定义套接字工厂)和激活。自定义套接字工厂允许控制客户与服务器之间的网络连接的处理方式。激活还可以使得在需要的时候激活自己的服务器,并提供远程对象分支,可以在服务器出现故障时继续存活。自定义连接管理是提高服务器安全性的有效方法,激活是在编写Jini时的一种非常有用的技术。因此如果想要使用这些特性,就会发现这些章节是很有用的。
第四部分讨论了建立在RMI顶层的两种技术:Jini和Enterprise JavaBeans(EJB)。Jini在最初推向市场时是作为一种技术推广的,使用这种技术可构建以一种灵活容错的方式进行合作的网络化设备。结果发现Jini可以应用的领域远不止于此。所有想要以一种容错方式与其他服务合作的网络服务(也就是几乎所有的网络服务)都可以使用Jini。我们将会看到Jini提供的神奇的特性使得它的应用如此之广,还将对HelloWorld示例进行扩展,以展示Jini是如何改善这种情况的。最后一章讲述EJB。EJB的目的是为创建可移植的Java组件提供一个模型,这些组件有助于读者实现包含事务处理、数据库和安全等功能的复杂业务逻辑。它还可以帮助读者将这样的组件以一种灵活的方式组装到应用中,从而使这些组件尽可能地可复用并尽可能松散地连接在一起。还将看一下EJB服务器提供的服务以及开发EJB组件需要进行的准备工作。最后,我们创建一个简单的EJB组件演示一下涉及的步骤。
文中的插图
本书所有插图(除了屏幕界面)使用的都是统一建模语言(Unified Modeling Language,UML)。UML是创建软件图表的一种标准方法。如果读者不熟悉UML,推荐看一下Grady Booch等编写的Unified Modeling Language User Guide(Addison-Wesley, 1999),书中讲述了如何高效地使用UML。UML是任何严谨的开发人员的工具箱中的一个非常重要的工具,我们强烈建议开发人员使用这种工具把思想和设计传达给其他开发人员。本书中的图表是用TogetherSoft公司的Together/J UML工具创建的。
使用的例子
本书使用经典的HelloWorld示例作为基础。这使得我们可以把精力集中在需要使用RMI的内容上,而不必为细节分神。虽然这可能不是非常生动的例子,但它的确为读者提供了源代码,读者可以用它作为自己应用的基础。
本书还选择了包括两个完整的样例应用。其中一个是移动代理系统,突出讲述了RMI的动态类加载特性的广泛用途。另一个样例是一个聊天系统,显示了很多重要的设计模式,在设计真正的RMI应用时很有用。这两个例子应该给读者一个更加完整的印象,使读者可以知道能够设计和实现出多大的RMI应用。
我们最后展示一个Jini示例和EJB示例,还是采用HelloWorld的样例代码,这对于向读者展示这两种技术能够完成的内容已经足够了。
随书光盘
在本书所附光盘中,可以找到书中例子的所有源代码。它们都有完整的build结构和make文件。这里选择使用非常好的Ant编译工具,Ant是一个Apache工程。可以从http://jakarta.apache .org中找到有关该工具的更多信息。
EJB的例子可以使用JBoss应用服务器运行,在随书光盘中有JBoss。JBoss对所有用途都是免费的,因此可以放心地在JBoss上建立应用,而无需担心许可问题。EJB的一个最重要的目标是允许组件在不同的EJB服务器之间移植,从而使得例子中不包含任何会把它约束在本JBoss服务器上的成分。有关JBoss的更多信息,可参见它的主页www.jboss.org。
至于Jini的例子,则需要从Jini的www.sun.com/jini/主页下载并安装Jini 1.1(或者更新版本)工具箱。
书中所有的例子均是在Sun的Java Development Kit 1.3版本上开发和测试的。在编译和运行这些例子之前需要下载和安装此JDK版本(或者更新的版本)。有关例子的更多信息,请参阅随书光盘的文档。
相关Web站点
本书有一个相应的Web站点,用它来通知读者本书的更新,包括:
·文字的错误改正
·RMI资源的链接
·源代码例子的更新
建议读者在继续阅读前先检查一下该Web站点,因为自从本书出版后,网站上可能已经有重大的变动。该站点是www.wiley.com/compbooks/oberg。
反馈信息
非常乐于听取任何读者的RMI工程,以及使用RMI、Jini或EJB的经验。欢迎你借助E-mail告诉我这样的例子、案例研究、失败教训或有帮助的技巧。得到你的同意后,我将把其中的一些放到Web站点上与其他人共享。你可以通过rickard@dreambean.com和我联系。