Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了
Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。
其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而
Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的
协议。因此,Java RMI具有Java的"Write Once,Run Anywhere"的优点,是分布式应用系统的百分之百纯Java解决方案。
用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。本文拟从程序的角度举例介绍怎样利用RMI实现Java分布式应用。
一、RMI系统运行机理
RMI应用程序通常包括两个独立的程序:服务器程序和客户机程序。典型的服务器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机调用这些远程对象的方法。而典型的客户机程序则从服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。RMI为服务器和客户机进行通信和信息传递提供了一种机制。
在与远程对象的通信过程中,RMI使用标准机制:stub(客户端存根---远程访问代理)和skeleton()(服务端框架--提供远程方法)。远程对象的stub担当远程对象的客户本地代表或代理人角色。调用程序将调用本地stub的方法,而本地stub将负责执行对远程对象的方法调用。在RMI中,远程对象的stub与该远程对象所实现的远程接口集相同。调用stub的方法时将执行下列操作:(1) 初始化与包含远程对象的远程虚拟机的连接;(2) 对远程虚拟机的参数进行编组(写入并传输);(3) 等待方法调用结果;(4) 解编(读取)返回值或返回的异常;(5) 将值返回给调用程序。为了向调用程序展示比较简单的调用机制,stub将参数的序列化和网络级通信等细节隐藏了起来。在远程虚拟机中,每个远程对象都可以有相应的skeleton(在JDK1.2环境中无需使用skeleton)。Skeleton负责将调用分配给实际的远程对象实现。它在接收方法调用时执行下列操作:(1) 解编(读取)远程方法的参数;(2) 调用实际远程对象实现上的方法;(3) 将结果(返回值或异常)编组(写入并传输)给调用程序。stub和skeleton由rmic编译器生成。
利用RMI编写分布式对象应用程序需要完成以下工作:(1) 定位远程对象。应用程序可使用两种机制中的一种得到对远程对象的引用。它既可用RMI的简单命名工具rmiregistry来注册它的远程对象,也可以将远程对象引用作为常规操作的一部分来进行传递和返回。(2)与远程对象通信。远程对象间通信的细节由RMI处理,对于程序员来说,远程通信看起来就像标准的Java方法调用。(3)给作为参数或返回值传递的对象加载类字节码。因为RMI允许调用程序将纯Java对象传给远程对象,所以,RMI将提供必要的机制,既可以加载对象的代码又可以传输对象的数据。在RMI分布式应用程序运行时,服务器调用注册服务程序以使名字与远程对象相关联。客户机在服务器上的注册服务程序中用远程对象的名字查找该远程对象,然后调用它的方法。
二、对象序列化
在RMI分布式应用系统中,服务器与客户机之间传递的Java对象必须是可序列化的对象。不可序列化的对象不能在对象流中进行传递。对象序列化扩展了核心Java输入/输出类,同时也支持对象。对象序列化支持把对象编码以及将通过它们可访问到的对象编码变成字节流;同时,它也支持流中对象图形的互补重构造。序列化用于轻型持久性和借助于套接字或远程方法调用(RMI)进行的通信。序列化中现在包括一个 API(Application Programming Interface,应用程序接口),允许独立于类的域指定对象的序列化数据,并允许使用现有协议将序列化数据域写入流中或从流中读取,以确保与缺省读写机制的兼容性。
为编写应用程序,除多数瞬态应用程序外,都必须具备存储和检索 Java对象的能力。以序列化方式存储和检索对象的关键在于提供重新构造该对象所需的足够对象状态。存储到流的对象可能会支持 Serializable(可序列化)或 Externalizable(可外部化)接口。对于Java对象,序列化形式必须能标识和校验存储其内容的对象所属的 Java类,并且将该内容还原为新的实例。对于可序列化对象,流将提供足够的信息将流的域还原为类的兼容版本。对于可外部化对象,类将全权负责其内容的外部格式。序列化 Java 对象的目的是:提供一种简单但可扩充的机制,以序列化方式维护 Java对象的类型及安全属性;具有支持编组和解编的扩展能力以满足远程对象的需要;具有可扩展性以支持 Java 对象的简单持久性;只有在自定义时,才需对每个类提供序列化自实现;允许对象定义其外部格式。
三、分布式应用的实现和运行步骤
编写Java RMI分布式应用程序的步骤主要包括以下几步:
(1) 将远程类的功能定义为Java接口。在Java中,远程对象是实现远程接口的类的实例。在远程接口中声明每个要远程调用的方法。远程接口具有如下特点:1) 远程接口必须声明为public。如果不这样,则除非客户端与远程接口在同一个包内,否则当试图装入实现该远程接口的远程对象时会得到错误结果。2) 远程对象扩展java.rmi.Remote接口。3) 除了所有应用程序特定的例外之外,每个方法还必须抛出java.rmi.RemoteException例外。4) 任何作为参数或返回值传送的远程对象的数据类型必须声明为远程接口类型,而不是实现类。
(2) 编写和实现服务器类。该类是实现(1)中定义的远程接口。所以在该类中至少要声明实现一个远程接口,并且必须具有构造方法。在该类中还要实现远程接口中所声明的各个远程方法。
(3) 编写使用远程服务的客户机程序。在该类中使用java.rmi.Naming中的lookup()方法获得对远程对象的引用,依据需要调用该引用的远程方法,其调用方式和对本地对象方法的调用相同。
实现了服务器和客户机的程序后,就是编译和运行该RMI系统。其步骤有:
(1) 使用javac编译远程接口类,远程接口实现类和客户机程序。
(2) 使用rmic编译器生成实现类的stub和skeleton。
(3) 启动RMI注册服务程序rmiregistry。
(4) 启动服务器端程序。
(5) 启动客户机程序。
四、实例分析
本文以一个实例来说明怎样编写RMI分布式应用系统。该实例用于实现一个三层的Client/Server程序,即包括数据库服务器、应用服务器和客户机三部分。其功能是让应用服务器把客户机发出的数据库查询请求传送到数据库服务器,数据库服务器再把数据库查询操作的结果送回应用服务器,然后送到客户端显示。整个系统包括服务器端和客户端程序,但这只是逻辑上的划分,其实它们都位于同一个机器上,即Web服务器。在客户端是一个Applet,通过它获得远程对象的引用,并调用远程对象的方法。而应用服务器上的程序其主要的功能是完成对数据库连接的配置、数据库的查询操作和把查询结果转换成可序列化的RecSet对象,当客户端调用远程对象的远程方法时就把它作为参数或返回值传递给客户端,实现服务器与客户机的通信。客户端得到查询结果后把它显示出来。在应用服务器和数据库服务器之间是通过Java的JDBC来连接的,本作者使用的是Sybase公司提供的JDBC Driver-jConnect5.0来实现对数据库的连接的。应用服务器同时也是Web服务器,因此只要上网的计算机通过浏览器就可以下载客户端的Applet程序到本地机上运行。具体实现步骤和部分程序代码如下。
分享到:
相关推荐
Java分布式应用程序设计是一种构建大型、可扩展且高可用性系统的方法。在Java中,通过利用网络中的多台计算机,可以创建能够跨越多个节点共享资源、处理任务和存储数据的复杂应用。这种技术允许应用程序的不同部分在...
Java分布式应用是指利用Java编程语言构建的、运行在多台计算机上的应用程序。这些应用程序能够跨网络进行通信和数据交换,实现资源共享和协同工作。Java的平台独立性和丰富的库支持使得它成为开发分布式应用的理想...
而CORBA则具有更大的跨平台性和灵活性,支持更多的语言,适用于更复杂的企业级分布式应用。选择RMI还是CORBA取决于具体项目的需求、现有基础设施和团队的熟悉程度。 总的来说,分布式计算通过Java RMI和CORBA等技术...
总结来说,Java RMI提供了实现分布式计算的有效工具,通过其强大的功能和简便的编程模型,使得开发人员能够轻松地构建跨越多台计算机的复杂系统,从而实现计算资源的共享和优化利用。在科学研究、工程计算、大数据...
在这个基于Java的课程设计中,我们重点探讨如何利用Java Remote Method Invocation (RMI) 技术来构建一个C/S(客户端/服务器)架构的分布式数据库。 Java RMI 是Java平台提供的一种用于在不同Java虚拟机之间进行...
在Java中,我们可以利用RMI(远程方法调用)、JMS(Java消息服务)和JNDI(Java命名和目录接口)等技术实现分布式通信。 2. 分布式Java应用核心组件 - EJB(Enterprise JavaBeans):提供了一种标准的组件模型,...
Java RMI 完整版 Java Remote Method Invocation(RMI...在 Java 分布式计算解决方案中,RMI 和 CORBA 均扮演着重要的角色。RMI 提供了简单而直接的分布式计算途径,而 CORBA 则提供了一个更为复杂的分布式对象系统。
Java分布式程序设计是现代软件开发中的重要组成部分,尤其在大数据处理、云计算以及互联网服务等领域有着广泛的应用。国防工业出版社出版的《Java分布式程序设计》高清晰版为学习者提供了全面而深入的指导,帮助...
总结来说,Java RMI为Java开发者提供了一种强大且易于使用的工具,用于构建分布式应用,它简化了对象在不同JVM之间的交互,并且能够与现有的系统进行集成,同时具备良好的安全性和性能。通过深入理解RMI的原理和特性...
远程方法调用(Remote Method Invocation,RMI)是Java平台上的一个重要工具,它允许在不同Java虚拟机(JVM)之间的对象进行交互,从而实现分布式计算。本项目“基于RMI的分布式议程管理系统”就是利用这一特性来...
Java分布式程序设计是现代企业级应用开发中的重要技术领域,它允许通过网络连接的多台计算机协同工作,处理大规模的数据和服务。在这个主题中,我们将深入探讨Java如何实现分布式系统,以及相关的关键概念和技术。 ...
分布式Java应用基础与实践是Java开发中的重要领域,它涵盖了多台计算机之间的协作,通过网络进行数据交换和服务调用,以实现大规模系统的高效运行。在Java世界中,分布式技术广泛应用于构建可扩展、高可用的互联网...
1. RMI(Remote Method Invocation):Java的远程方法调用机制,允许一个Java对象调用位于不同JVM上的另一个对象的方法,是Java分布式计算的基础。 2. EJB(Enterprise JavaBeans):面向企业级应用的组件模型,提供...
Java以其强大的跨平台能力和丰富的开源库,成为了构建分布式应用的首选语言。本篇文章将深入探讨分布式Java应用的基础知识和实践技巧,帮助开发者理解和掌握分布式系统的核心概念。 1. 分布式系统概述 分布式系统是...
JAVA远程接口调用介绍 JAVA远程接口调用(RMI)是Java的一组API,用于开发...RMI是Java分布式应用程序开发的核心解决方案之一,提供了简单而直接的途径来实现分布式计算,并具有Java的安全性和可移植性等强大功能。
Java作为一门广泛使用的编程语言,其在分布式应用领域的应用非常广泛。本篇内容将深入探讨分布式Java应用的基础概念、设计原则以及实战技巧。 1. 分布式系统概述 分布式系统是由多台独立的计算机节点通过网络相互...
通过以上对Java RMI的详细介绍,我们可以看出Java RMI不仅为开发者提供了强大的分布式应用开发能力,而且还提供了丰富的高级特性,使得开发者能够更加专注于业务逻辑的实现,而无需过多关心底层通信细节。...
这一特性使得Java在构建分布式应用时具有强大的能力,尤其在文件传输场景中,RMI可以高效地实现在网络中的大文件,如视频文件,的传输。 RMI的核心概念包括: 1. 远程接口(Remote Interface):这是定义远程方法的...