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程式到本地机上运行。具体实现步骤和部分程式代码如下。
转载地址:http://www.sudu.cn/info/html/edu/20050119/316545.html
分享到:
相关推荐
Java分布式应用程序设计是一种构建大型、可扩展且高可用性系统的方法。在Java中,通过利用网络中的多台计算机,可以创建能够跨越多个节点共享资源、处理任务和存储数据的复杂应用。这种技术允许应用程序的不同部分在...
Java分布式应用是指利用Java编程语言构建的、运行在多台计算机上的应用程序。这些应用程序能够跨网络进行通信和数据交换,实现资源共享和协同工作。Java的平台独立性和丰富的库支持使得它成为开发分布式应用的理想...
综上所述,基于Java RMI的分布式数据库系统在设计与应用中,充分利用了Java语言的特点和RMI通信机制的优势,为实现高效、可靠、可扩展的分布式数据库系统提供了坚实的基础。随着技术的不断进步,分布式数据库系统的...
Java分布式系统架构是一种将应用程序分布在多个计算节点上运行的技术,以提高系统的可伸缩性、容错性和性能。源码分析对于理解这种架构至关重要,尤其是对于开发者来说,它提供了深入学习和自定义系统的机会。本资源...
在本例中,我们构建了一个基于 RMI 的分布式应用实例,旨在演示如何利用 RMI 实现分布式任务处理。 #### 二、RMI的核心组成部分 ##### 1. 定位远程对象 - **名字服务功能**:RMI 提供了名字服务功能,如 `java.rmi...
如Redis、Hazelcast或Infinispan等分布式缓存系统,可以在Java分布式应用程序中提供高速的数据访问和共享,缓解数据库压力,提升系统性能。 以上就是Java在分布式应用程序设计中涉及的一些关键技术,这些技术相互...
在分布式数据库系统的实现过程中,通过使用Java RMI,可以实现数据对象的反复利用,提高系统的使用效率,降低系统的开发难度。同时,基于Java RMI的分布式数据库系统还可以保证系统的安全性。 本资源还介绍了分布式...
### 基于MVC和RMI的分布式应用解析 #### MVC设计模式的深度剖析 MVC,即Model-View-Controller(模型-视图-控制器),是一种经典的软件设计模式,由Xerox PARC在20世纪80年代为Smalltalk-80编程语言所创。这一模式...
全书分为四个主要部分,全面覆盖了从基础的网络通信到复杂的系统架构设计的各个环节,旨在帮助读者掌握构建高性能、高可用和可伸缩分布式应用的关键技能。 第一部分:基于Java实现网络通信 这一部分详细阐述了Java...
在Java中,我们可以利用Java RMI框架来实现这样的系统。RMI允许一个Java对象调用运行在另一台机器上的对象的方法,就像调用本地对象一样简单。这对于构建分布式应用和服务尤其有用。 Java RMI的基本步骤包括: 1. *...
Java提供了丰富的API支持,如Java RMI(Remote Method Invocation)、JMS(Java Message Service)等,使得开发者能够轻松地构建分布式应用程序。此外,Java还拥有强大的社区支持和丰富的开源框架资源,例如Spring ...
在这个项目中,我们利用RMI构建了一个学生成绩管理系统,实现了跨网络的、透明的远程方法调用。 系统概述: 学生成绩管理系统主要负责学生的成绩录入、查询、分析等功能。通过RMI,我们可以将这些功能分布在不同的...
文档中的业务场景描述了一个监控系统的示例,该系统利用RMI技术实现设备告警的实时显示。 - **业务流程**: 1. 设备告警。 2. 调用客户端(`RMIClient`)。 3. 客户端通过RMI调用服务器端(`RMIServer`)上的业务...
Java RMI(Remote Method Invocation)是一种在Java平台上实现分布式计算的技术,它允许对象在不同的Java虚拟机...通过学习和实践这个项目,我们可以更熟练地掌握Java RMI技术,并能应用于构建更复杂的分布式应用。
在这个例子中,我们看到的是一个利用RMI实现实时数据同步的Java应用。下面将详细解释RMI的工作原理及其在分布式环境中的应用。 1. **RMI概念**: - RMI是Java平台提供的一种机制,允许Java对象调用运行在不同JVM上...
这一技术极大地促进了程序之间的远程通信,是构建分布式应用的重要基石之一。 #### 二、RMI 的发展历程及其重要性 RMI 是 Java 平台的一项关键功能,它的发展经历了多个阶段。最初,RMI 提供了基础的远程方法调用...
总结来说,Java RMI提供了实现分布式计算的有效工具,通过其强大的功能和简便的编程模型,使得开发人员能够轻松地构建跨越多台计算机的复杂系统,从而实现计算资源的共享和优化利用。在科学研究、工程计算、大数据...
这个技术使得Java程序能够像调用本地方法一样调用网络另一端的对象的方法,极大地简化了分布式应用的开发。在Java RMI的帮助下,开发者可以构建分布式系统,将计算任务分布在多台计算机上执行,从而提高计算效率,...
它允许在不同的Java虚拟机(JVM)之间进行对象方法的调用,使得开发分布式应用程序变得更加简单。在本项目中,我们构建了一个基于RMI的分布式议程服务,旨在提供一个跨网络的会议管理平台,让不同客户端可以共享和...