RMI-Java远程方法调用的实现(一)

来源:百度文库 编辑:神马文学网 时间:2024/04/20 13:40:40
一、RMI概述    Java Remote Method Invocation ( RMI -- Java远程方法调用)为采用Java对象的分布式计算提供了简单而直接的 途径。这些对象可以是新的Java对象,也可以是围绕现 有API的简单的Java包装程序。Java体现了“编写一次就 能在任何地方运行的模式。而RMI可将Java模式进行扩展 ,使之可在任何地方运行”。    RMI可利用标准Java本机方法接口JNI与现有的和原有的 系统相连接。RMI还可利用标准JDBC包与现有的关系数据 库连接。RMI/JNI和RMI/JDBC相结合,可帮助您利用RMI与目 前使用非Java语言的现有服务器进行通信,而且在您需 要时可扩展Java在这些服务器上的使用。RMI可帮助您在 扩展使用时充分利用Java的强大功能。  
二、RMI的优点    从最基本的角度看,RMI是Java的远程过程调用(RPC)机 制。与传统的RPC系统相比,RMI具有若干优点,因为它 是Java面向对象方法的一部分。传统的RPC系统采用中性 语言,所以是最普通的系统--它们不能提供所有可能的 目标平台所具有的功能。 RMI以Java为核心,可与采用本机方法与现有系统相连 接。这就是说,RMI可采用自然、直接和功能全面的方式 为您提供分布式计算技术,而这种技术可帮助您以不断 递增和无缝的方式为整个系统添加Java功能。    其主要优点 1、面向对象:RMI可将完整的对象作为参数和返回值进行传 递,而不仅仅是预定义的数据类型。也就是说,您可以 将类似Java哈希表这样的复杂类型作为一个参数进行传 递。而在目前的RPC系统中,您只能依靠客户机将此类对 象分解成基本数据类型,然后传递这些数据类型,最后 在服务器端重新创建哈希表。RMI则不需额外的客户程序 代码(将对象分解成基本数据类型),直接跨网传递对象 。 2、可移动属性:RMI可将属性(类实现程序)从客户机移动 到服务器,或者从服务器移到客户机。例如,您可以定 义一个检查雇员开支报告的接口,以便察看雇员是否遵 守了公司目前实行的政策。在开支报告创建后,客户机 就会从服务器端获得实现该接口的对象。如果政策发生 变化,服务器端就会开始返回使用了新政策的该接口的 另一个实现程序。您不必在用户系统上安装任何新的软 件就能在客户端检查限制条件--从而向用户提供更快的 反馈,并降低服务器的工作量。这样就能具备最大的灵 活性,因为政策改变时只需要您编写一个新的Java类, 并将其在服务器主机上安装一次即可。 3、设计方式:对象传递功能使您可以在分布式计算中充分 利用面向对象技术的强大功能,如二层和三层结构系统 。如果您能够传递属性,那么您就可以在您的解决方案 中使用面向对象的设计方式。所有面向对象的设计方式 无不依靠不同的属性来发挥功能,如果不能传递完整的 对象--包括实现和类型--就会失去设计方式上所提供的 优点。 4、安全:RMI使用Java内置的安全机制保证下载执行程序时 用户系统的安全。RMI使用专门为保护系统免遭恶意小应 用程序侵害而设计的安全管理程序,可保护您的系统和 网络免遭潜在的恶意下载程序的破坏。在情况严重时, 服务器可拒绝下载任何执行程序。 5、便于编写和使用:RMI使得Java远程服务程序和访问这些 服务程序的Java客户程序的编写工作变得轻松、简单。 远程接口实际上就是Java接口。服务程序大约用三行指 令宣布本身是服务程序,其它方面则与任何其它Java对 象类似。这种简单方法便于快速编写完整的分布式对象 系统的服务程序,并快速地制做软件的原型和早期版本 ,以便于进行测试和评估。因为RMI程序编写简单,所以 维护也简单。 6、可连接现有/原有的系统:RMI可通过Java的本机方法接 口JNI与现有系统进行进行交互。利用RMI和JNI,您就能 用Java语言编写客户端程序,还能使用现有的服务器端 程序。在使用RMI/JNI与现有服务器连接时,您可以有选择 地用Java重新编写服务程序的任何部分,并使新的程序 充分发挥Java的功能。类似地,RMI可利用JDBC、在不修 改使用数据库的现有非Java源代码的前提下与现有关系 数据库进行交互。 7、编写一次,到处运行:RMI是Java“编写一次,到处运行 ”方法的一部分。任何基于RMI的系统均可100%地移植到 任何Java虚拟机上,RMI/JDBC系统也不例外。如果使用RMI/JNI 与现有系统进行交互工作,则采用JNI编写的代码可与任 何Java虚拟机进行编译、运行。 8、分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不 再被网络中任何客户程序所引用的远程服务对象。与Java 虚拟机内部的垃圾收集类似,分布式垃圾收集功能允许 用户根据自己的需要定义服务器对象,并且明确这些对 象在不再被客户机引用时会被删除。 9、并行计算:RMI采用多线程处理方法,可使您的服务器利 用这些Java线程更好地并行处理客户端的请求。 Java分布式计算解决方案:RMI从JDK 1.1开始就是Java平台 的核心部分,因此,它存在于任何一台1.1 Java虚拟机中 。所有RMI系统均采用相同的公开协议,所以,所有Java 系统均可直接相互对话,而不必事先对协议进行转换。三、RMI 体系结构    为了实现位置透明性,RMI 引入了两种特殊类型的对象:存根(stub)和框架(skeleton)。存根是代表远程对象的客户机端对象。存根具有和远程对象相同的接口或方法列表,但当客户机调用存根方法时,存根通过 RMI 基础结构将请求转发到远程对象,实际上由远程对象执行请求。在服务器端,框架对象处理“远方”的所有细节,因此实际的远程对象不必担心这些细节。也就是说,您完全可以象编码本地对象一样来编码远程对象。框架将远程对象从 RMI 基础结构分离开来。在远程方法请求期间,RMI 基础结构自动调用框架对象,因此它可以发挥自己的作用。关于这种设置的最大的好处是,您不必亲自为存根和框架编写代码。JDK 包含工具 rmic,它会为您创建存根和框架的类文件。   (备注:此处应该还有一个图的,可图没传好,跑到下面去了)    RMI 应用程序通常包括两个独立的程序:服务器程序和客户机程序。典型的服务 器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机 调用那些远程对象上的方法。而典型的客户机程序则从服务器中得到一个或多个 远程对象的引用,然后调用远程对象的方法。RMI 为服务器和客户机进行通讯 和信息传递提供了一种机制。这样的应用程序有时被称为分布式对象应用程序。    分布式对象应用程序需要: 1、定位远程对象    应用程序可使用两种机制中的一种得到对远程对象的引用。它既可用 RMI 的简 单命名工具 rmiregistry 来注册它的远程对象;也可将远程对象引用作为常规 操作的一部分来进行传递和返回。 2、与远程对象通讯    远程对象间通讯的细节由 RMI 处理;对于程序员来说,远程通讯看起来就象标 准的 Java 方法调用。给作为参数或返回值传递的对象加载类字节码因为 RMI 允许调用程序将纯 Java 对象传给远程对象,所以 RMI 将提供必要的机制, 既可以加载对象的代码又可以传输对象的数据。 服务器调用注册服务程序以使名字与远程对象相关联。客户机在服务器注册服务 程序中用远程对象的名字查找该远程对象,然后调用它的方法。RMI 能用 Java 系统支持的任何 URL 协议(例如 HTTP、FTP、file 等)加载类字节码。