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) 启动客户机程序。
分享到:
相关推荐
3. **理论基础**:对 Java 基础有一定了解,尤其是关于类、接口和序列化的概念。 #### 四、实验步骤详解 1. **定义远程接口**: - 首先需要定义一个远程接口,该接口中的方法必须抛出 `java.rmi.RemoteException`...
- **RMIHelloWorld.rar**:这是一个RMI基础示例的压缩包,通常包含了一个简单的RMI客户端和服务器端的源代码,帮助初学者理解RMI的基本工作原理和交互流程。通过解压并运行这个例子,你可以看到RMI如何实现远程方法...
在IT行业中,远程方法调用(Remote Method Invocation,简称RMI)是一种用于分布式计算的技术,它允许Java对象在不同的Java虚拟机(JVM)之间进行通信。RMI是Java平台的标准部分,它使得开发者能够创建分布式系统,...
Java的Thread类和Runnable接口提供了实现多线程的基础。在描述中提到的"多线程服务器"部分,可能会涵盖如何创建和管理线程,以及如何在多线程环境下确保数据的安全性。 最后,远程方法调用(RMI)是Java提供的一个...
3. 分布式计算:Java内置了网络应用编程接口,便于开发分布式应用,如RMI机制,使得远程方法调用成为可能。 4. 健壮性:Java的强类型系统、异常处理和垃圾回收机制保障了程序的稳定性。 5. 安全性:Java有严格的安全...
- **CORBA**:通过Java IDL和Java RMI-IIOP实现的CORBA接口,提供跨平台的分布式对象通信。 - **JavaMail**:Java邮件API,用于发送和接收电子邮件。 - **Transactions**:事务处理,确保数据一致性。 对于初学...
这门课程主要涵盖Java语言的基础概念和面向对象编程的核心原则。清华大学出版社出版的《JAVA与面向对象程序设计实验指导与习题集》是学习此课程的一个推荐教材,结合上海大学春季学期的教学计划,学生可以有效地掌握...
实习是将理论知识转化为实践能力的关键步骤,通过Java实习,学生赵军得以在实际项目中运用所学,深化对Java特性的理解,提升编程技能,为今后的职业发展奠定了坚实的基础。在达内科技这样的专业机构中,学生可以接触...
7. **CORBA和RMI**:Java2支持Common Object Request Broker Architecture(CORBA)和Remote Method Invocation(RMI),这些技术使得不同系统之间的远程对象通信变得更加容易。 ### Java2的学习路径 对于初学者来...
1. RMI(Remote Method Invocation):Java的远程方法调用机制,允许一个Java对象调用位于不同JVM上的另一个对象的方法,是Java分布式计算的基础。 2. EJB(Enterprise JavaBeans):面向企业级应用的组件模型,提供...
5. 分布式系统:Java RMI(Remote Method Invocation)和JMS(Java Message Service)用于分布式系统的通信和消息传递。 四、Java的最新发展 1. Java 8:引入了lambda表达式、函数式接口等新特性,提升了代码的简洁...
1. **Java基础**:Java是一种面向对象的编程语言,具有平台无关性、安全性、稳定性和可移植性等特点。学习这些项目时,你需要掌握类、对象、封装、继承、多态等基础概念。 2. **异常处理**:Java中的异常处理机制是...
2. **RMI(远程方法调用)**:Java原生的RMI机制使得Java对象可以在不同JVM间进行透明调用,是实现分布式应用的基础。 3. **分布式缓存**:如Hazelcast和 Ehcache,它们提供了高效的分布式缓存解决方案,减轻数据库...
分布式Java应用:基础与实践 在当今的互联网时代,分布式系统已经成为企业级应用程序开发的...《分布式java应用:基础与实践》这本书正是为此目的而编写,旨在为Java开发者提供全面的分布式系统理论知识和实践经验。
通过这次实习,实习生不仅加深了对Java语言的理解,还学会了如何将理论知识应用于实际项目中,提升了编程技巧、团队协作能力和解决问题的能力。这些经验对于毕业后快速适应职场并有效开展工作至关重要。
- **软件工程硕士**:强调扎实的计算机理论基础,丰富的JAVA EE项目开发经验。 5. **专业技能**: - **编程语言**:精通Java,熟悉OO编程,具备分析和设计能力。 - **工具使用**:能用UML和RationalRose进行项目...
在这些课件中,可能涵盖了中间件的基础理论、每种技术的工作原理、实际应用案例以及如何使用它们来构建分布式应用等内容。Lecture_1可能介绍了中间件的基本概念和重要性,Lecture_3可能深入讨论了Jini的架构和实现...
1. **RMI(Remote Method Invocation)**:Java RMI允许一个对象调用远程机器上的方法,是Java中实现分布式对象的基础。 2. **JMS(Java Message Service)**:JMS是Java平台的消息中间件接口,用于在分布式系统中...
### Java分布式应用基础 在分布式系统中,Java是一种广泛使用的编程语言,它提供了丰富的库和框架来支持分布式计算。Java的跨平台特性使得它在分布式环境中特别受欢迎,因为可以确保代码在不同的硬件和操作系统上的...