原文地址:
http://download.oracle.com/javase/1.5.0/docs/guide/rmi/spec/rmi-objmodel.html
Chapter 2 :Distributed Object Model(分布式对象模型)
2.1 分布式对象应用程序
RMI应用程序一般由服务端和客户端组成。一个典型的RMI服务应用程序会创建一些远程对象,使这些远程对象的引用可以被访问,然后等着客户端去调用这些远程对象上的方法。一个典型的RMI客户端会获取一个指向一个或者多个远程对象的引用,然后调用方法。RMI提供一种机制,以实现服务端和客户端的通信和信息的来回传递。这样的应用程序有时候就被称作分布式应用程序。
分布式对象应用程序需要具备如下功能:
应用程序使用两种机制中的一种趋获取远程对象的引用。应用程序可以使用RMI简单命名服务(rmiregistry)注册它的远程对象,或者像正常的操作一样传递和返回远程对象的应用。
RMI会处理具体远程对象之间通信的细节;对于程序员来说,远程对象的通信就跟标准的方法调用一样。
因为RMI允许调用者传递对象到远程对象中,所以RMI提供了必要的机制来加载对象的代码
下面的图描述了一个RMI分布式程序使用注册去获取远程对象的引用。服务端调用注册模块用名称标识关联远程对象。客户端在服务端的注册器中通过名字标识查找对应的远程对象,然后调用远程对象上的方法。下面的图还显示了RMI系统通过已有的web服务来加载类的字节流代码。RMI可以基于任何java支持的URL协议来加载类的字节码。
2.2 术语定义
在java的分布式对象模型中,remote object 就是一种对象,它的方法能被来自不同的JVM,甚至是不同主机的程序所调用。这种对象必须实现一个或者多个remote接口,remote接口声明了远程对象应该具有的方法。
Remote mothod invocation(RMI) 指的就是调用远程对象上remote接口方法的一种行为。最重要的是,远程对象上的方法调用跟对本地对象进行方法调用有着一样的语法格式。
2.3 分布式和非分布式模型的对比
分布式和非分布式的模型的相同点:
- 远程对象和本地对象的引用在任何方法调用中都能当做方法的参数被传递,或者作为方法执行的结果。
- 远程对象类型能被转换成任何一种它实现的远程接口。
- 内建的instanceof方法都能被用来测试远程对象支持的远程接口。
分布式和非分布式的模型的不同点:
- 远程对象的客户端从来只跟远程对象实现的接口打交道,而不是具体的远程对象类。
- 远程方法调用的时候,参数和返回值是非远程对象(即本地对象),那么传递参数,或者返回方法结果的时候,都是通过复制对象而不是传递引用来实现的。因为传递对象应用只能在单个java虚拟机中起作用。
- 远程对象总是通过引用来传递,而不是复制远程对象的实现。
- 因为远程方法调用的出错模式比本地方法调用来的复杂,所以客户端在进行远程方法调用的时候必须处理更多额外的异常。
2.4 RMI接口和类概述
java.rmi 包中的接口和类实现RMI功能,下面的图展示了这些接口和类的继承关系:
2.4.1 java.rmi.Remote 接口
在RMI中, remote接口描述了被远程JVM调用的方法集. remote接口必须满足以下的要求:
- 一个remote接口必须直接或者间接的继承接口java.rmi.Remote。
- 每个remote接口的声明或者其父接口的声明必须满足远程方法声明的要求:
1.一个远程方法的声明必须包括 java.rmi.RemoteException异常(或者它的父类如java.io.IOException 或 者java.lang.Exception) 在它的抛出源中,此外还要抛出应用程序相关的异常。
2.在远程方法的声明中,在方法的参数中或者返回值中直接或者间接(嵌套在非远程对象中)包含远程对象,那么 这个对象必须声明为remote接口,而不是接口的实现类。
接口 java.rmi.Remote 只是一个标记型的接口,它没有定义任何的方法:
public interface Remote {}
一个远程接口必须至少继承java.rmi.Remote接口(直接或者间接)。然而符合下面条件的情况下,一个远程接口也可以 不继承远程接口:
- 远程接口也可以继承只要满足远程方法描述必备的条件的接口。
举个例子,下面的BankAccount为访问银行账号定义的一个接口。它包含远程方法:存钱(deposit to the account),查询余额(to get the account balance),取钱(to withdraw from the account):
public interface BankAccount extends java.rmi.Remote {
public void deposit(float amount)
throws java.rmi.RemoteException;
public void withdraw(float amount)
throws OverdrawnException, java.rmi.RemoteException;
public float getBalance()
throws java.rmi.RemoteException;
}
下面的例子展示了一个正确的远程接口Beta,它继承了一个非远程接口 Alpha,Alpha它有远程方法,和接口java.rmi.Remotei。Remote:
public interface Alpha {
public final String okay = "constants are okay too";
public Object foo(Object obj)
throws java.rmi.RemoteException;
public void bar() throws java.io.IOException;
public int baz() throws java.lang.Exception;
}
public interface Beta extends Alpha, java.rmi.Remote {
public void ping() throws java.rmi.RemoteException;
}
2.4.2 RemoteException类
java.rmi.RemoteException是RMI远程方法调用中抛出异常类的父类。为了保证使用RMI的应用程序的健壮性,远程接口中每个远程方法必须在它的抛出源中指定
java.rmi.RemoteException(或者是它的父类 java.io.IOException
or java.lang.Exception
)。
远程方法调用失败后,java.rmi.RemoteException将被抛出。远程方法调用失败的原因包括:
- 通信失败(远程服务不可达,或者拒绝连接,或者连接已经被服务关闭,等等)
- 在参数或者返回值的编列或者反编列失败
- 协议错误
RemoteException是被检查异常(必须被远程方法调用者处理,在编译的时候被检查),而不是运行时异常。
2.4.3 RemoteObject类和它的子类
java.rmi.server.RemoteObject和它的子类java.rmi.server.RemoteServer和java.rmi.server.UnicastRemoteObject
和java.rmi.activation.Activatable 提供了RMI服务的功能。
-
java.rmi.server.RemoteObject提供了
java.lang.Object类
hashCode
, equals
, 和toString方法的实现,以支持远程对象的功能。
-
UnicastRemoteObject和
Activatable提供了创建远程对象和导出远程对象的方法。这些子类还定义了远程对象引用的语意,例如服务是简单远程对象还是activatable remote object。
java.rmi.server.UnicastRemoteObject定义了一个单一的远程对象,该对象只在服务进程活动的时候可用。
-
类
java.rmi.activation.Activatable是一个抽象类,它定义了一个
activatable远程对象,该对象在方法被调用的时候启动执行并且在必要的时候关闭自身。
下一章节 RMI 系统 概述
- 大小: 9 KB
- 大小: 9.3 KB
分享到:
相关推荐
Chapter 2: The Java Programming Environment 15 Installing the Java Development Kit 16 Choosing a Development Environment 21 Using the Command-Line Tools 22 Using an Integrated Development ...
选举Java-Rmi-Arthurgbranco Trabalho deeleiçãoutilizando Java rmi 演员:亚瑟·格拉米塞利·布兰科(Arthur Gramiscelli Branco) 科莫(Como)地狱: 更改或更改PROJECT_PATH的配置文件配置文件,然后选择...
JAVA分布式之RMI实例教程网络通信原理[收集].pdf
This book provides an introduction to concurrent, real-time, distributed programming with Java object-oriented language support as an algorithm description tool. It describes in particular the ...
自动柜员机系统 使用Java RMI为分布式对象的类工作
java rmi java rmijava rmi javajava rmi java rmi rmi
RMI教程 Java RMIRMI教程 Java RMIRMI教程 Java RMIRMI教程 Java RMIRMI教程 Java RMI
Java RMI-IIOP示例 分布式数据处理
该系统是使用JAVA RMI技术开发的,具有Socket编程和用于大学项目的多线程。
RMI-IIOP (称为“ IIOP上的RMI”)表示Internet球间协议(IIOP)上的Java远程方法调用(RMI)接口,该接口向Java平台提供了通用对象请求代理体系结构(CORBA)分布式计算功能。 更多信息 : 建造 编译项目文件 转...
java rmi远程调用服务器搭建,rmi具体实现步骤说明,
javafx-rmit-tic-tac-toe 使用 JavaFX 和 RMI(和 Maven)制作的分布式井字游戏。
RMI RMI-IIOP 客户端服务器交互 源代码下载
WebGIS是当前GIS的技术热点,立足于WebGIS的分布式特性,在分析Java RMI特点以及优势的基础上,提出基于Java RMI的分布式WebGIS构造模型,并且详细介绍了空间数据模型、组件注册服务器等相关概念和主要实现技术。
使用Java RMI创建一个分布式议程共享服务。不同的用户可以使用这个共享议程服务执行查询、添加和删除会议的操作。服务器支持会议的登记和清除等功能
RMi java 分布式 开发,包括代码和部署例子
分布式对象技术综述,介绍了3种分布式对象技术:OMG的CORBA技术、 Microsoft公司的DCOM技术和Sun公司的Java/RMI技术。
A java RMI server client math operator. Simple project for the network services class.
网络上绝大多数关于Java RMI分布式编程的资料真的很久、很古老了, 我也是偶尔看到别人的文章,自己动手做实验才总结的一些心得与例子, 希望能够帮到那些有用的人!
实验名称 基于Socket的C/S编程实验 实验名称 基于Java RMI的C/S编程实验