用RMI开发基于-Java分布式应用_杜风雷_第1页
用RMI开发基于-Java分布式应用_杜风雷_第2页
用RMI开发基于-Java分布式应用_杜风雷_第3页
用RMI开发基于-Java分布式应用_杜风雷_第4页
用RMI开发基于-Java分布式应用_杜风雷_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-用 RMI 开发基于 Java 的分布式应用杜风雷( 警官职业学院, 310018)摘 要: 由于 Java 具有跨平台、代码可移植性、平安高效等广泛而强大的功能, 因而在开发网络分布式应用的时候, 可以用它自身的机制实现分布式计算, 一种基于 Java 的远程方法调用(RMI)为我们开发分布式应用提供了行之有效的解决方案。关键词: Java RMI, 分布式应用中图法: TP390 文献标识码: A 文章编号: 1000- 7180(2006)07- 004The Distributed Application Based on Java With RMIDU Feng-lei(Zheji

2、ang Police Vocational Academy, Hangzhou 310018 China)Abetract: Java can go beyond one platform, its codes can be replanted, and it is safe and efficient. So when weempolder the distributed application of Network, we can use its own mechanism to realize the distributed calculation. Akind of RMI based

3、 on Java provides an efficient resolvent to empolder the distributed application for us.Key words: Java RMI, Distributed application1 引言随着信息化的开展, 各系统之间的数据的交换量大大增加, 但计算机网络硬件设备与操作系统千差万别, 因此需要使用远程方法调用 RMI(RemoteMeth Invocation), 可以在不同的 Java 虚拟机(JVM)之间实现对象与对象的通信。JVM可以位于一样或不同计算机上, 在多个 JVM中, 一个 JVM可以调用存储在

4、其它 JVM的对象的方法。2 远程方法调用(RMI)的特点2.1 RMI 编程的特点(1) 客户机可以向本地方法一样调用远程效劳器上的方法;(2) 可以根据接口指定客户机/效劳器编程合约;(3) 可以从效劳器对象缺省二进制类文件, 自动生成调动/反调动代码;(4) 将 Java 编程模型扩展到机器边界( 和 Java虚拟机(JVM)边界之外), 不需要任何特殊语法;(5) 还可以和一个远程方法调用中的数据同时传输行为(代码)。2.2 RMI 与 CORBA作为分布式应用程序框架的规, COBRA 首当其冲, 它是由对象管理组织(OMG) 开发的。与CORBA 不同的是, CORBA 能够利用不

5、同编程语言( 例如 C/C+、Basic 等) 开发实现分布式应用, 而RMI 是一种纯 Java 解决方案。在 RMI 中, 程序的所有局部都由 Java 语言编写, 这样, 开发出来的程序完全符合 Java 规, 便于实现跨平台、扩展和移植。按照笔者所在西北电力建立集团公司的情况看, 效劳器操作系统主要有 Linu* 和 Windows2000Server, 分别存在于公司和部门当中, 它们是不同的系统平台; 同时, 公司下属各个工程工程部又距离很远, 近的几十公里, 远则到达上千公里甚至位于国外, 因此跨平台和远程这两大功能在开发应用系统时就必须考虑, 而 RMI 恰恰能够用它的自身特点

6、来满足编程需要。2.3 RMI 根本体系构造简介RMI 通过 TCP/IP 在部使用 Socket, 象其名称暗示的那样, 它能够帮助我们查找并执行远程对象的方法。RMI 的目的是让位于不同 JVM中的对象,在外观及行为上都像是本地的对象。通常, 我们把调用这种远程对象的 JVM, 称为客户机; 而把包括这种远程对象的 JVM, 称为效劳器。尽管对一个远程对象的引用和获得对本地对象的引用有所不同,但我们可以把远程对象像本地对象一样使用。应用收稿日期: 2005-11-09程序并不知道一个对象是远程的还是本地的。实际上, 远程对象上被调用的方法与本地对象上调用的方法, 具有一样的语法构造。作为

7、RMI 的底层(会包含复杂的 Socket 操作),它会自动截获方法调用, 找到远程对象, 然后处理远程请求。RMI 设计的重要之处, 就在于不但在设计上实现了远程功能, 而且实现了设计的透明性。RMI 的根本体系构造, 概括起来说, 由三个抽象层组成:(1) 存根/框架层(Stubs/Skeletons Layer)RMI 为我们引入了两种特殊类型的对象, 称为存根(Stub) 和框架(Skeleton) , 它们组成了 RMI 的第一层。在远程通信的时候, 要利用 TCP/IP 协议,做很多底层数据的打包传输。运用 Java 技术, 我们先要把数据或者对象转换成字节流, 便于网络传输, 这

8、个过程叫聚集; 当收到远程传来的字节流后, 我们要把流信息转换成对象或者数据, 这个过程叫解读, 它与聚集刚好相反。Stub 和 Skeleton 层位于实际应用程序之下, 建立在 Pro*y( 代理) 设计方案之上。Stub 类的作用是远程效劳器实现的代理的角色, Stub 是客户方对象; Skeleton 类用于帮助对象通过 RMI 与 Stub通信, 它从链路中读取方法调用的参数, 向远程服务实现对象进展调用, 承受返回值, 然后再把返回值写回到 Stub。(2) 远程引用层远程引用层定义和支持着 RMI 连接的调用语义。RMI 进展远程要用到 JRMP (Java RemoteMeth

9、od Protocol, 即 Java 远程方法协议), 这一层提供专用于 JRMP 的 RemoteRef 对象, 它位于 java.rmi.server 包, 代表着远程对象的一个句柄。Re-moteRef 使用远程引用来执行远程对象的一个远程方法调用。(3) 传输层传输层在 JVM之间建立基于流的网络连接, 并且负责设置和管理这些连接。这时候, RMI 使用一种线级协议进展基于 TCP/IP 的连接, 该协议就是Java 远程方法协议(JRMP, 即 Java Remote MethodProtocol)。在 JDK 版本 1.2 开场, JRMP 不再需要Skeleton, 而是使用

10、reflection 来建立与远程效劳的连接。为了生成 Stub, 我们须用 rmic。当前的 RMI 实现中, 传输层建立在 TCP/IP 根底上, 设计用于在客户和效劳器之间建立一条连接(即使联网有障碍)。2.4 开发的根本步骤使用 RMI 编写 Client/Server 模式 ( 客户/效劳器)应用程序, 包括 6 个根本步骤:(1) 定义远程接口;(2) 实现远程接口;(3) 准备远程调用的效劳器对象;(4) 生成残根 Stub( 客户代理) 和框架 Skeleton(效劳器实体);(5) 用 rmiregistry 找到远程对象;(6) 运行测试 RMI 分布式应用。2.5 开发信

11、息发布系统实例在开发 RMI 进展分布式之前, 需要将各项功能模块化, 即把实际应用抽象成符合 Java 规的类和接口模型, 使这些类和接口之间互相协作, 能实现各自独立的功能, 最后, 可以把它们组合成统一的网络分布式系统。现在, 以开发公司信息发布系统为例, 把主模块( 主要的类文件) 的名称定为信息发布效劳, 为了保持应用开发的数据一致性和清晰度, 接下来涉及的其它模块命名也将以这个模块命名为基准。(1) 定义远程接口Java RMI 运行环境要求任何可以远程调用的方法必须放在远程接口中。该远程接口用来扩展java.rmi.Remote 接口, 在 Java API 中, 可以发现它没有

12、任何方法, 只是个标志性接口, 这样, 可以让 Java运行环境(JRE) 认识每个接口的特殊属性, 以便能够远程。因此, 按照信息发布效劳的命名, 首先须将信息发布效劳定义为远程接口, 同时仅放入一个供测试的方法 getRemoteInfo()来实现编码, 将所有模块至于新建的 enterprise.distribute 包中, 代码如下:/ - - - - - - - - InfoDistributeRemote. java- - - - - - - -package enterprise. distribute;import java.rmi.Remote;import java.rmi

13、.RemoteE*ception;public interface InfoDistributeRemote e*tends Remotepublic String getRemoteInfo( ) throws RemoteE*ception;(2) 实现远程接口这是一个实现远程对象的类。如果实现了远程接口, 就能够覆盖该对象中的所有方法, 因此, 远程对象的实现类将真正包含我们希望导出的方法的代码。在远程信息发布系统中, 我们至少实现一个远程接口的对象, 它就是远程可的对象。这里, 信息发布效劳类可以为我们生成远程可对象的实例:/ - - - - - - - - - InfoDistrib

14、uteService. java- - - - - - -package enterprise. distribute;import java.rmi.RemoteE*ception;import java.rmi.server.UnicastRemoteObject;public class InfoDistributeServicee*tends UnicastRemoteObject implements InfoDistributeRemotepublic InfoDistributeService() throws RemoteE*ceptionsuper();/ The retur

15、n value of the method only for testing.public String getRemoteInfo()return“Hello! I am a remote object.;信 息 发 布 服 务 类 类 实 现 远 程 接 口 InfoDis-teObject。由于符合 InfoDistributeRemote 接口, 因此该类除构造方法之外, 还应有 getRemoteInfo( )方法,而且必须将该方法实现。同时我们注意到, getRemoteInfo( )方法抛出了java.rmi.RemoteE*ception 异常。由于远程方法调用过程中, 要进展

16、很多的低级网络操作, 因此网络错误可能在调用过程中随时发生, 这样, 远程接口中的每个方法( 尽管这里只有一个 getRemoteInfo( )方法) 都必须抛出 RemoteE*ception 异常, 而且, java.rmi.RemoteE*ception 都要在代码中显式处理, 即将所有 RMI 活动涉及的代码都放在 try- catch 块中。(3) 准备供远程调用的效劳器对象这是一个作为效劳器使用的类, 它是相对于要远程方法的客户端而言的。它存储着绑定的字符串和对象。将远程对象设置成承受远程调用就像启动了侦听 ServerSocket 对象的 socket 效劳器。事实上在使用 RM

17、I 时, TCP/IP 协议的传输方式, 在幕后发生了很多底层网络操作, 但是此刻, 用户不需要知道这些细节, 只需要逐步导出远程对象:在 Java 开发工具的较新版本 JDK 1.4 中, 可以选 择 java.rmi.UnicastRemoteObject 或 者 java.rmi.Activation.Activatable。其中, 更多用到的是 Unicas-tRemoteObject, 因为它顾名思义, 就是在客户机与服务器对象实例之间建立一对一连接。(4) 生成 Stub 和 Skeleton由 RMI 生成的调动与反调动的远程调动代码也和 Java 的其它代码一样, 都包含在后缀

18、是.class的文件中。运用 RMI 之后, 在客户机上生成的调动参数和反调动返回值的代码称为残根(Stub), 效劳器上生成的反调动参数和进展实际方法调用调动返回值的代码称为框架 (Skeleton)。可以使用 RMI自带的命令行工具 rmic( 即 RMI piler), 先扫描远程对象的.class 文件, 随之生成残根与框架代码。(5) 远程客户端: 这是一个帮助我们远程方法提供帮助的类, 它是最终用户。rmic 调用如下(在当前目录):我们有了远程接口和实现, 就可以用 rmic 对类进展编译, 生成 Stub 和 Skeleton, 在命令行窗口中使用以下代码行:/ pile al

19、l java source filesjavac enterprisedistribute*.java/ make stub and skeleton code运行完毕后, 在当前目录生成以下文件( 即调动代码):InfoDistributeService_Stub.classInfoDistributeService_Skel.class(6) 用 rmiregistry 找到远程对象导出效劳器方的对象之后, 就可以远程,但客户机还要设法与这些远程对象取得联系。由于分布式应用程序可能涉及许多不同机器, 因此通信的所有机器对之间需要建立初始连接, 换句话说,就是要设法找到初始远程对象, 这项工

20、作通过rmiregistry 命令执行。JDK 开发工具提供了实用程序 RMI Registry, 用来维护文本名和远程对象之间的映射, 可以进展远程。在客户机方, RMI 注册表可以通过同一 java.rmi.Naming 类的 lookup()静态方法用程序。例如, 远程主机为 iServer, 远程对象实例为 InfoDis-tributeService 实例, 远程端口号为 5678, 则客户机如果查找远程主机 iServer 中的远程 InfoDistribute-Service 实例, 则引用实例时须使用远程接口 In-foDistributeRemote, 代码如下:InfoDi

21、stributeRemote iServer=( InfoDistributeRemote)Naming.lookup “(rmi:/iServer:5678/InfoDistribute Ser-vice);在效劳器方, 导出的远程对象可以通过 java.rmi.Naming 类在本地注册 rmiregistry 的运行实例。例如, 用 rebind()方法将 iService 中的 InfoDistribute-Service 的实例与名称 InfoDistributeService 相关联。完毕语本文以分布式虚拟靶试系统为例, 着重介绍了基于 HLA 的分布式仿真系统开发的方法和思路,给

22、出了系统的总体分析、开发环境, 及联邦成员的功能实现, 并对本例中联邦成员的同步问题进展了讨论。本系统较原先基于 DIS 的仿真系统, 具有灵活性好, 网络数据冗余低、易扩展等优点, 为该系统的功能进一步扩展创造了条件。参考文献1 周彦, 戴剑伟. 仿真程序设计 M. : 电子工业出版社, 20022 颖. 基于 HLA 的水下战仿真系统研究J. 系统仿真学报, 2004.123 皓. 基于 HLA 的鱼雷武器系统分布交互仿真研究D.: 西北工业大学. 20034 马立元. 基于 HLA 的分布式交互仿真技术及其应用J.计算机工程, 2003吴晓洁 女, (1983- ) , 硕士研究生。研究

23、方向为计算机应用技术。翟正军 男, (1965- ) , 教授, 硕士生导师。研究方向为计算机应用技术。InfoDistributeService iService=newInfoDistributeService( );Naming.rebind“(/ InfoDistributeService,iService);综 上 所 述 , InfoDistributeRemote 是 个 Java 接口, 因此 iServer 实际上是实现 InfoDistributeRemote接口的本地对象实例, 它不在远程, 而是远程 In-foDistributeService 的本地表示。也就是说,

24、它是由前述 rmic 工具自动生成的残根码 InfoDistributeSer-vice_Stub.class 的本地实例。客户机实现通过 iServer 变量维护远程对象的调用。事实上, iServer 引用变量是实现 InfoDistribute接口的对象的本地引用, 该对象是 InfoDistribute-Service 残根实现。这个残根和效劳器方的框架一起通过 InfoDistributeRemote 接口调动/反调动所有远程调用。当我们把 InfoDistributeService 看成是实现 In-foDistributeRemote 接口的本地实例的时候, 残根代码只在幕后进展

25、工作, 而实现这一切则变得非常透明。由上述原理, 可以进一步设计完善客户机和服务器代码, 进而编写出完整的应用程序。(7) 运行测试 RMI 分布式应用在确认已经设计好必须的几大类模块后, 我们开场按以下步骤, 运行并测试该信息发布系统的基本功能 ( 即仅仅实现远程接口中声明的 getRemote-Info( )方法)。在前面定义的包 enterprise.distribute 中, 执行javac 命令编译后缀为.java 的源文件。javac enter-prise/distribute/*.java接着, 用 RMIC 工具生成残根与框架。编译之后, 需要确定客户机与效劳器发行版本的容。因此, 需用 jar 命令, 将客户机与效劳器发行版本包装成 .jar 文件。 其中, 包装效劳器的文件命令如下:jar cvf InfoDistributeService.jarenterprisedistributeIn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论