(译)java-rmi 序

 

本书的目标读者是从事分布式应用程序开发的JAVA程序员。所谓的“分布式应用程序”,我解释为:位于不同机器、不同进程中的多个程序能够以对最终用户透明的方式像一个应用程序一样协同工作,那么这些程序就被称为“分布式应用程序”[1]。最新版本的JAVA平台,java2(及其标准扩展库),对分布式应用程序的开发提供了广泛地支持。

[1]     Java-rmi这本书中,

a)         “程序”:仅运行在一个Java虚拟机中的JAVA代码;

b)        “应用程序”:分别运行在多个Java虚拟机中的多个程序。并且,这些位于不同进程中的程序彼此协同工作对终端用户来说就像是一个程序一样。

书中的内容主要围绕远程方法调用(RMI)框架。RMI框架是基于JAVA实现分布式应用程序的可靠、高效的技术。由于RMI框架是一套纯JAVA的分布式应用程序解决方案,所以它相对于CORBA规范而言更简单和更易用。最后,RMI框架不仅是一组有力的分布式应用程序架设方案,同时它也是一个套掌握分布式应用程序开发设计的学习方案。

我假定读者没有关于分布式编程与网络编程的任何经验。因此,书中将从基础的知识点讲起,其中包括了RMI框架的底层概念、类和设计思想。接着,书中还会提及关于JAVA编程的高端知识。作为一个负责任的技术类作家,如果在讲解RMI分布式应用程序开发的书中只肤浅地讲述RMI框架使用技术技巧,而不拿出一定的笔墨来讨论Socket和线程化主题的话,则是完全很没有责任心的表现。所以,Socket和线程化也是本书中的重点讨论主题,虽然它们和RMI框架使用技术关系不大。

为了使您从书中获得更多的收获,您最好有一定的JAVA编程基础。同时,您需要熟悉JAVA编程语言,了解JAVA事件模型,同时拥有一个简单的运行环境以实践书中提供的案例程序。最后,你还需要允许自己在学习过程中犯错误。像学习其它的编程语言一样,动手实践是学习RMI框架的最好方法。

关于这本书

书中用了很多笔墨向读者阐述RMI框架的底层技术。而且,借助多个基于C/S架构的项目案例,书中还特别讲解了从流(stream)SocketRMI框架工作原理等诸多内容。

虽然本书中的章节的次序安排是经过多位专家的反复考量的,而且在“博克里大学进修学院”的实地教学中取得了良好的教学效果,但是“随需应变”地跳读有时候对您来说也是个不错的选择。比如说,第十章是关于对像序列化技术的。这一章仅与第一章的内容(流技术)有联系。因此,读者完全可以在阅读了本书的前4章内容之后可立即阅读第十章的技术知识。(第四章引入了书中的第一个RMI分布式应用程序案例)

书中内容总共被分成了三大部分。

第一部分介绍RMI的基础知识,其中包括流技术,Socket程序库。接下来,分别介绍了基于SocketRMI框架完成的两个分布式应用程序。更准确地说,这两个分布式应用程序是基于不同技术实现的同一个分布式应用程序的两个不同版本。到此为止,RMI框架的入门级的概念介绍完毕。

而第一部分的剩余的章节(第五章至第九章)详细分析了网络编程的引入对于传统的应用程序设计的影响。第一部分最后还会给读者总结两套设计原则:

1.       如何将分布式应用程序拆分为客户端应用程序与服务器端应用程序。

2.       如何设计客户端应用程序与服务器端应用程序之间的交互。

在精读的书中的第一部分之后,读者将有能力设计且实施一个简单的RMI分布式应用程序了。虽然它并不具有扩展性和健壮性,但是这样的分布式应用程序应该已经可以应付许多普通情况了。

第二部分深入展开了对RMI框架的底层实现技术的讲解;同时,在这一部分中也开始带领读者讨论如何提高分布式应用程序安全性和扩展性。更形象地说,书中的第一部分讨论的焦点是“如何划定客户端应用程序与服务器端应用程序之间分水岭”,而第二部分的重点是“如何使服务器端应用程序更可扩展”。在第二部分中,更多的笔墨还是放在了RMI的底层技术,而对RMI框架与接口的使用技术介绍比较少。在第二部分中的大部分章节的学习会比较困难。但是,第二部分中的章节是本书的核心内容。

第三部分是由一组相互独立的章节组成的。这些章节分别讨论了RMI框架不同技术方面的高级特性。第二部分与第三部分的最大差别在于:第二部分中涉及的内容是所有参与RMI分布式应用程序开发的程序员都必须掌握的,同时也是构筑复杂RMI分布式应用程序所必备的知识。而第三部分中论述的诸多主题虽然也很有用且很重要,但是相对于第二部分而言就它们就不是人人必会的了。

下面就是本书中各个章节的摘要:

第一部分

第一章

       流是一个相当简单的数据结构;人们通常把流看作是线性的字节序列。通常来说,信息以流的格式被发送到设备(如,硬盘)或网络上。这是关于RMI框架底层技术的章节。它主要向读者阐述JAVA对流操作的支持。

第二章

       Socket是创建与维护网络连接的常用抽象。大多数编程语言和操作系统中都支持Socket库。这是关于RMI框架底层技术的章节。它主要向读者描述了JAVASocket类。

第三章

       本章是对前两章学习内容的一次总结与练习。在第三章中,介绍了如何使用Socket和流技术构筑分布式应用程序。许多关于分布式编程的基本的概念将在这里被引入。然而,因为安排本章初衷是抛砖引玉,所以读者还只能接触到有限的专业知识。

第四章

       基于Socket和流技术打造的分布式打印服务被转换成基于RMI框架实现。本章将介绍RMI的基本的技术特点,以及构建一个简单的RMI应用程序所必需的操作步骤。此处是书中第一次讲解RMI框架的应用技术。

第五章

       在客户端-服务器分布式架构领域,银行项目案例是最古老和最有名的教学案例。它将与打印服务案例协手成为贯穿本书始终的重要教学案例。

第六章

       设计与搭建分布式应用程序的第一步就需要确定服务器端应用程序规模与结构。具体地讲就是,我们必须决定哪些功能被放置在服务器端,以及这些功能如何在服务器端的多台服务器间分配。最终,我将会向读者推荐一套实现这些设计目标的设计原则。

第七章

       一旦整个应用程序已经被划分为能客户端应用程序与服务器端应用程序并且确定了它们分别需要实现的功能,那么你需要设计各个应用程序之间的如何通信了。更具体地说,咱们需要解决如何设计应用程序间接口的问题。本章则将提供一系列接口的设计原则,以帮助读者设计和评估自己的接口。

第八章

       我们将接触到具体的分布式编码任务。首先,我们将给出银行案例的第一版实现。这样做一方面可以强化第四章的课程内容;另一方面,我们还要讨论在服务器端应用程序开发中出现的取舍抉择。

第九章

       第九章续第八章接着交代了客户端应用程序的实现代码和启动代码。(启动代码的作用就是启动服务器端的应用程序,同时保证客户端应用程序可以连接到服务器应用程序)

第二部分

第十章

       序列化是一种算法。RMI框架使用序列化算法给即将发送到网络或设备上的信息进行编码。虽然JAVA的序列化机制很易用,但是要做到高效且有效地驾驭这项技术还是有许多工作需要做的。在第十章中,我们就是更详细地解释JAVA的序列化机制。

第十一章

       本章是书中关于线程化的两个章节中的第一章。其中涉及了线程化的基本概念,包括

1.       什么是线程?

2.       如何实现基本的线程操作?

同样,这是关于RMI框架底层技术的章节。

第十二章

       在这一章中,我们将把第十一章中的学习的线程化的概念与操作方法应用到银行项目案例中。同时,和大家讨论一下应用程序线程化的设计原则。最后,要提及池的概念与实践-池是高效利用稀缺资源的一种常见且有效的方法。

第十三章

       介绍如何测试分布式应用程序的方法。虽然这些方法是针对书中的案例提出的,但是它们的作用范围绝不仅限于此。最后,读者将会对分布式应用程序的最佳性能有全面认识。

第十四章

       RMI注册机(registry)是一个随JDK捆绑发布的命名服务程序。本章将向读者详细地介绍RMI注册机的工作机理,并且以此为跳板从广义上讨论如何合理地利用命名服务。

第十五章

       本章在前章的基础上更加全面深入地讨论了命名服务。其核心内容就是要告诉读者如何实现一个更具有扩展性、灵活性且基于邦连(federated)的命名服务。于是,向读者展示命名服务的设计原则。此外,新的高级的命名服务实现程序也是开发线程化应用程序的经典教学案例。这一章的中的知识点很难理解,如果您是初次阅读本书完全可以将这一章先跳过。

第十六章

       RMI框架中,大量代码是用来处理远程通信双方的通信细节的。对于这一部分的程序代码在业内虽然并没有给予一个统一的名称。但是,我称它们为“RMI运行环境(RMI Runtime)”。RMI运行环境负担维护网络连接和实现分布式垃圾回收功能。我们将讲解RMI的运行环境工作原理和列举RMI运行环境的系统配置参数。

第十七章

       本章先是讨论一种常见的设计模式,即“工厂模式”。然后,结合“工厂模式”介绍RMI技术中的重要组成部分“激活框架”。“激活框架”能够极大地简化RMI中“工厂模式”的实现工作。

第三部分

第十八章

       SocketRMI框架的一个重要的基石。在RMI应用程序中,程序开发人员能够实现对Socket类型的控制。本章就将会重点讲一讲如何切换RMI应用中使用的Socket类型。

第十九章

       动态类加载技术使应用程序能够通过下载.class类文件实现自动更新。这个功能是RMI最具有革新性的特性之一。同时,它也是具体开发工作中的许多错误与混淆的问题根源所在。

第二十章

       JAVA2中最重要的创新就是添加了一组功能完善的安全类与安全API。安全策略是广义化的APPLET安全沙箱机制。这套机制提供了一组便捷的方法,使程序员能够轻松授予或剥夺某个代码块执行某些特定操作的权限。

第二十一章

       截止到本章之前,对RMI分布式应用程序所有的讨论与分析基本上都集中于服务器端。这样安排的一个重要原因是客户端应用程序的复杂性主要还是集中在Java Swing的开发细节中而不是在RMI框架上。但是,功能强大的客户端是任何一个分布式应用程序都不可或缺的。所以,这一章将和大家讨论客户端开发的一些实现策略。

第二十二章

       防火墙是当前大部分公司网络环境中的现实情况。有些时候出于功能实现的需要,咱们就必须得穿跃防火墙。这一章是书中最具Cookbook风格的章节,手把手教你穿跃防火墙。

第二十三章

       本章关注的是RMICORBA的互操作性。CORBA是另一个分布式应用程序框架,它类似于RMI,但是还是有两个不同:

1.       CORBA规范的实现语言不一定是JAVA,即CORBA规范可以实现跨语言分布式。

2.       CORBA是由另一个独立的标准化组织制定的。

CORBA框架也非常地流行,而且它早于RMI框架出现。本章除了讨论CORBA框架以外,还向读者介绍RMICORBA之间的桥接协议RMI/IIOP。通过RMI/IIOP协议就可以让RMICORBA的语言了。

关于书中的案例代码

书中案例代码都是基于JDK1.3编写的。虽然就最近的几个JDK版本来看RMI框架的底层技术没有发生剧烈变化,但是如果您试图在JDK1.1或者更早版本JDK中运行此案例程序的话,还是可能会出问题的。

       此外,RMI这个名词在书中代表两层含义的。其一,RMI表示在RMI框架中定义的接口与API。其二,RMI表示由javasoft提供的RMI接口与API的实现程序,而且javasoft版的RMI框架是与JDK捆绑发布。当然,除了sun公司提供了RMI规范的实现外,比较有名的还有由BEA公司在Weblogic产品中封装的RMI实现。

       请不要将书中的案例代码直接应用于产品应用中。书中的案例代码仅只是教学程序,它们根本达不到工业标准的要求。更主要的是,案例代码不仅活埋全部异常,而且也不做任何finally处理。当然,在书中使用符合工业标准的程序代码是没有任何技术问题的,但是如果那样做的话必然会使整本书的篇幅大大增加且会降低案例程序的可读性。

字体格式约定

使用“斜体”表示:

l         路径名、文件名、目录和程序名

l         新定义的术语

l         互联网地址,比如说,域名与URL地址

使用“常宽体”表示:

l         JAVA程序中直接显示的任何文字,包括保留字、数据类型名、常量、方法名、变量、类名和接口名。

l         命令、输入参数和开关标记位。

l         所有的JSPJAVA代码列表。

l         HTML文档、标签和属性

使用“常宽斜体”表示:

l         占位符-在案例代码中,占位符所在位置需要由读者自己的值来填充。

使用“常宽粗体”表示:

l         关于代码案例的文字说明或警告信息

 

代码风格约定

       书中的案例代码基本上遵循传统的C编码风格。但是针对变量名的命名,我是按照JAVA约定来做的,即,成员变量名以下划线起头、局部变量以小写字母开头。

       而且,书中的变量名和方法名通常都比较长,以便更具有描述性。[2]此外,当在正文中引用方法名时,方法的输入参数会被刻意地省略掉。比方说,当在正文中引用readFromStream(InputStream inputStream)方法时,我会这样写readFromStream()瞧输入参数被我给省略掉了。

2]在书中的后面的章节中,我们会偶尔地向大家介绍被自动生成的代码(比如,被RMI编译器生成的代码)。这一类代码可读性很差,特别是在这些程序中,变量名都是像这样$param_DocumentDescription_1被命名的。

       通常,在一些代码块中会出现省略号,比如像这样:
      
catch (PrinterException printerException){
        ....
  
 }
。这样的代码表示在当前程序中有一段“不重要的”代码被省略了。

       书中案例程序的所有类文件都被放置在了com.ora.rmibook包中。并且每一章都拥有一个程序包 例如,第一章的案例程序是被放在了com.ora.rmibook.chapter1包中;第二章中的案例程序是被放在了com.ora.rmibook.chapter2包中,以此类推。我努力让每一章的案例程序都相对完整且相互独立,以便让读者在浏览与调试这些程序时可以更加方便。但是,这种做法也有不利的一面,就是各个章节的案例程序中都会有许多重复的部分。

       在编写本书时,我尽力地避免使用匿名类和本地内部类(虽然它们的确很有用,但是这样作会降低整个案例程序的可读性)。总而言之,如果你可以轻松地阅读、理解下面这个代码片段:
      
private void buildGUI( ) {
        JPanel mainPanel = new JPanel(new BorderLayout( ));
        _messageBox = new JTextArea( );
        mainPanel.add(new JScrollPane(_messageBox),
        BorderLayout.CENTER);
        createButtons( );

    }
那你对本书中出现任何程序代码就都可以应对自如了。

应用程序

       每章中的源代码都可以被组织成一个独立的工程。为了使读者浏览程序代码更加的方便,所有包括main()方法的类都遵循了一致的命名约定。例如,如果一个名为Foo的类中包括了main()方法,那么在它所在的程序包中必定还包括一个名为FooFrame的类文件。以第一章中的程序代码为例,在ViewFile类所在的程序包中,必定还存在一个ViewFileFrame.类。并且在ViewFile类中包括的代码有:
    package com.ora.rmibook.section1.chapter1;
    public class ViewFile {
        public static void main(String[] arguments) {
            (new ViewFileFrame()).show( );
        }
    }
在包含了main()方法的ViewFile类中保留一个顶层GUI类(Frame类)的引用会使得整个程序在IDE中更容易被浏览。例如,图P-1就显示了JBuilder3.0的一个截图。在P-1图中,JBuilder3.0正在显示第二章中的程序代码。

P-1. JBuilder3.0屏幕截图

 

编译与运行

       书中的程序代码可以在不同的系统中编译和运行。但是,其挟带的批处理程序却不具有平台移植性。我为每章的案例程序都创建了一个批处理程序,并且把它放在案例程序的根目录上。下面列举第十五章中的批处理程序NamingService.bat
      
start java -cp d:/classes-Djava.security.policy=c:/java.policy com.ora.rmibook.chapter15.basicapps.NamingService

很明显这个批处理程序对于它的运行环境做了许多的假设(这些假设很具有指导性和普遍意义)。读者可以根据自己的系统设置对它们做调整。这些具体的假设包括:

l         使用start系统指令启动一个背景进程。start系统指令只有在Windows NTWindows 2000等微软系的操作系统中才能被识别。至于其它的操作系统启动进程的指令就不一样了。

l         程序代码被保存在d:/classes目录中。

l         安全策略文件java.policy被保存在c:/目录下。

l         保存中间计算结果的临时文件被保存在c:/temp目录内。

下载案例程序代码

       书中的所有案例的源代码都从O’Reilly的官方网站http://www.oreilly.com/catalog/javarmi下载。

获得更多的信息

       在书中,我都向读者推荐了若干本与RMI技术相关的各种专项技术的参考资料。例如,在第十二章中我就向读者推荐了一本关于迸发编程的佳作(这本书也是我的最爱)。

       此外,在互联网上也有许多关于RMI的信息与资料。其中,推荐给读者的网站有:

JavasoftRMI主页

       在这里包含了关于RMI技术的最新的动态信息。它的地址是:

http://java.sun.com/products/jdk/rmi/

JAVA教程的RMI小径

       无论你是涉足哪一项JAVA技术,Java教程都是最好的启程教材。它的RMI部分的地址是:

              http://java.sun.com/docs/books/tutorial/rmi/index.html

RMI 用户邮件列表

       RMI用户邮件列表是由Javasoft运营维护的。在这里从初学者到高手应有尽有。当然,如果你提的问题足够有趣、有挑战性,那说不定还会有世界级的RMI高手给你出谋划策呢。它的邮件列表文档保存地址在:

       http://archives.java.sun.com/archives/rmi-users.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值