




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本篇用实例来说明采用Java进行RMI远程方法调用及CORBA服务调用的实现方法,并分析它们的异同,从而为分布应用软件的开发者提供参考和帮助。 Internet/Intranet的飞速发展使得Web应用日益广泛而复杂,Web早已不仅仅是超媒体信息的浏览工具,它正逐步发展成为分布异构环境中企业应用的通用前端和事务处理的展现窗口。在分布式环境异构中,各种机器所采用的操作系统、网络通信协议和应用软件千差万别,要实现信息共享和软件资源的整合十分困难,然而一个健壮的分布式计算框架能为可移植的分布式应用软件开发带来巨大的便利和好处。 分布式对象技术主要是在分布式异构环境下建立应用系统框架和对象构件。在应用
2、系统框架的支撑下,开发者可以将软件功能封装为更易管理和使用的对象,这些对象可以跨越不同的软、硬件平台进行互操作。目前,分布式互操作标准主要有Microsoft的COM/DCOM标准、Sun公司的Java RMI标准和OMG组织的CORBA标准。 Java RMI调用实例Java RMI简介 远程方法调用(RMI,Remote Method Invocation)是jdk1.1中引入的分布式对象软件包,它的出现大大简化了分布异构环境中Java应用之间的通信。 要使用RMI,必须构建四个主要的类:远程对象的本地接口、远程对象实现、RMI客户机和RMI服务器。RMI服务器生成远程对象实现的一个实例,
3、并用一个专有的URL注册。RMI客户机在远程RMI服务器上查找服务对象,并将它转换成本地接口类型,然后像对待一个本地对象一样使用它。 下面是一个简单的RMI实例,RMI客户机通过RMI服务器提供的方法实现对两个双精度浮点数的加减运算。例子虽然很简单,但掌握了Java RMI调用的基本原理和方法,在实现复杂应用时,我们需要做的也只是完善远程对象的实现类而已。 RMI实例分析 1.远程对象的本地接口声明(RMIOperate.java) 该类仅仅是一个接口声明,RMI客户机可以直接使用它,RMI服务器必须通过一个远程对象来实现它,并用某个专有的URL注册它的一个实例。 具体代码如下: packag
4、e wf.rmi;/包名import java.rmi.*; /导入类包/*RMI本地接口必须从Remote接口派生*/ public interface RMIOperate extends Remote /*接口中的具体方法声明,注意必须声明抛出RemoteException*/public double add(double x, double y) throws RemoteException; /输入两个浮点数,返回其和public double minus(double x, double y) throws RemoteException; /输入两个浮点数,返回其差2.远程对象
5、实现类(OperateImpl.java) 这个类应实现RMI客户机调用的远程服务对象的本地接口,它必须从UnicastRemoteObject继承,构造函数应抛出RemoteException异常。 具体代码如下: package wf.rmi; /包名/导入需要的类包import java.rmi.*;import wf.rmi.RMIOperate;import java.rmi.server.UnicastRemoteObject;public class OperateImpl extends UnicastRemoteObject implements RMIOperate /*构
6、造函数*/ public OperateImpl() throws RemoteException /*实现本地接口中声明的add方法*/ public double add(double x, double y) throws RemoteException double z = x + y;return z; /*实现本地接口中声明的minus方法*/ public double minus(double x, double y) throws RemoteException double z = x - y;return z; 3.RMI服务器类(RMIServer.java) 该类创建
7、远程对象实现类OperateImpl的一个实例,然后通过一个专有的URL来注册它。所谓注册就是通过Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,将OperateImpl实例绑定到指定的URL上。 具体实现代码如下: package wf.rmi; /包名/导入需要的类包import java.rmi.Naming;import wf.rmi.OperateImpl;public class RMIServer public static void main(String args) try/创建远程对象的实现实例OperateImpl
8、operObj = new OperateImpl();/提示信息 System.out.println("RMI Server Starting.");/将实例注册到专有的URL Naming.rebind("rmi:/RMIOperate", operObj);/等待RMI客户机调用的提示信息 System.out.println("Waiting RMI Client Invoke."); catch(Exception e)e.printStackTrace(); 4.RMI客户机类(RMIClient.java) RMI客户
9、使用java.rmi.Naming.lookup()方法,在指定的远程主机上查找RMI服务对象,若找到就把它转换成本地接口RMIOperate类型。它与CORBA不同之处在于RMI客户机必须知道提供RMI服务主机的URL,这个URL可以通过rmi:/host/path或rmi:/host:port/path来指定,如果省略端口号,就默认使用1099。Java.rmi.Naming.lookup()方法可能产生三个异常:Java.rmi.RemoteException、Java.rmi.NotBoundException、. MalformedURLException,三个异常都需要捕获。 下面
10、是详细代码: package wf.rmi; /包名/导入需要的类包import java.rmi.*;import .*;import java.io.*;public class RMIClientpublic static void main(String args)tryBufferedReader readIn = new BufferedReader(new InputStreamReader(System.in);String host = "localhost" /默认为本地主机 /带输入参数时,将host设置为指定主机if (args.length >
11、; 0) host = args0; /根据指定的URL定位远程实现对象RMIOperate rmiObj = (RMIOperate)Naming.lookup("rmi:/" + host + "/RMIOperate");/提示输入运算参数1System.out.println("Please Input Data1: ");String str1 = readIn.readLine(); /读取输入参数1double x = 0;try x = Double.parseDouble(str1); /分析输入参数1,转换为dou
12、ble类型catch(NumberFormatException nfe)x = 0; /如果转换异常,则重置x为0 /提示输入运算参数2System.out.println("Please Input Data2: ");String str2 = readIn.readLine();/读取输入参数2double y = 0;tryy = Double.parseDouble(str2); /分析输入参数2,转换为double类型catch(NumberFormatException nfe)y = 0; /如果转换异常,则重置y为0 /调用远程对象的本地接口方法,实现输
13、入参数的加、减运算,并输出结果System.out.println("Data1 Add Data2 Result is: " + rmiObj.add(x, y);System.out.println("Data1 minus Data2 Result is: " + rmiObj.minus(x, y);catch(Exception e)e.printStackTrace();RMI Server/Client的编译与运行 (1).编译所有的源代码(如图1) 图1(2).生成客户端存根和服务器框架(如图2) 图2这将构造OperateImpl_St
14、ub.class和OperateImpl_Skel.class。这时可将所有的Class文件打包成jar,并将其分别置于RMI客户机和RMI服务器的ClassPath中(如图3): 图3当然,也可以只将RMIOperate.class、RMIClient.class和OperateImpl_Stub.class复制到RMI客户机,将RMIOperate.class、OperateImpl.class 、RMIServer.class和OperateImpl_Skel.class复制到RMI服务器。 (3).启动RMI注册(如图4) 图4(4).运行和调用 在服务器上执行RMIServer(如图
15、5) 图5 在本地客户机上运行RMIClient(如图6) 图6 在远程客户机上运行RMIClient(须指明RMI服务器主机名或IP地址,如图7) 图7至RMI从Java1.1开始,RMI使得运行于不同JVM(包括不同主机)上的Java应用程序可以彼此通话。 即:一个JVM中的Java应用程序可以调用另一JVM上的对象(远程对象)所定义的方法。 Java RMI有着重要的意义。RMI在Java网络编程和高级编程中都有重要的应用,如EJB, Jini等。 Java2对RMI做了很多增强和改进,如安全性,动态代码下载等。 本文给出了一个最简单的例子,以说明其中的一些基本原理。本文的特点是注重了实
16、际开发和真正的运行 环境相结合,模拟了RMI真正的开发和运行过程。 1. 实现远程接口,生成远程对象,存根(Stub)和框架(Skeleton) 实现远程接口,远程接口告诉JVM:实现了该接口的对象可以远程调用及有哪些方法可以调用。 本例子中定义了sayHello()。由于远程调用会涉及到网络通讯,因此这些方法都要抛出RemoteException. 远程接口和远程对象可以由A开发,并把远程接口(Hello)d打包分给Client端开发者B。 建立f:server目录,把Hello.java和HelloImpl.java拷贝到该目录中。 / Hello.java package jdevelo
17、per.rmi; import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote String sayHello() throws RemoteException; 生成远程对象. / HelloImpl.java package jdeveloper.rmi; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.
18、rmi.server.UnicastRemoteObject; public class HelloImpl extends UnicastRemoteObject implements Hello public HelloImpl() throws RemoteException super(); public String sayHello() return "Hello World!" public static void main(String args) / Create and install a security manager if (System.getS
19、ecurityManager() = null) System.setSecurityManager(new RMISecurityManager(); try Hello obj = new HelloImpl(); / Bind this object instance to the name "HelloServer" Naming.rebind("HelloServer", obj); System.out.println("HelloServer bound in registry"); catch (Exception e
20、) System.out.println("HelloImpl err: " + e.getMessage(); e.printStackTrace(); 存根(Stub)和框架(Skeleton) f: cd server javac -d . Hello.java javac -d . HelloImpl.java rmic -d . jdeveloper.rmi.HelloImpl jar cvf hello.jar jdeveloperrmiHello.class 把hello.jar分发给Client端的开发者B。 存根(Stub)的存放! 存根(Stub)是动态
21、下载的。Client通过存根(Stub)和远程对象的框架(Skeleton)通讯,对Client来 讲就象操作本地对象一样。在大多数情况下,可下载的代码放到http服务器的某个目录中。本例子放到http:/hjc/rmi下。 hjc:机器名,rmi:http的一个目录。如果只是单机测试则可以放到某个目录下 如f:serverclasses. 本文将对以上两种方法都给出运行的步骤(policy文件和bat文件)。 2. 实现Client端程序 / HelloClient.java package jdeveloper.rmi; import java.rmi.RMISecurityManager
22、; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.NotBoundException; public class HelloClient public static void main(String args) throws Exception System.setSecurityManager(new RMISecurityManager(); Hello RemoteObj = (Hello)Naming.lookup("/"+ args0 +"/HelloSe
23、rver"); System.out.println(RemoteObj.sayHello(); 建立f:client目录,把HelloClient.java拷贝到该目录中。 建立f:clientclasses目录,把hello.jar拷贝到该目录中。 f: cd client javac -classpath %CLASSPATH%;f:clientclasseshello.jar -d . HelloClient.java 3. 运行程序 启动DOS窗口 set classpath= start rmiregistry A.以单机方式运行 建立f:serverclassesjde
24、veloperrmi目录 f: cd f:serverclasses copy f:serverhello.jar . copy f:serverjdeveloperrmiHelloImpl_Stub.class f:serverclassesjdeveloperrmi jar xvf hello.jar 启动新的DOS窗口 把 starthelloserver.bat 和 rmiserver.policy 放到f:server 运行 starthelloserver starthelloserver.bat SET CP=f:server;f:serverclasseshello.jar e
25、cho using classpath: %CP% java -classpath %CP% -Djava.rmi.server.codebase=file:/f:serverclasses/ -Djava.rmi.server.hostname=hjc -Djava.security.policy=rmiserver.policy jdeveloper.rmi.HelloImpl rmiserver.policy grant permission .SocketPermission "*:1024-65535", "connect" ; 启动新的DOS
26、窗口 把 starthelloclient.bat 和 rmiclient.policy 放到f:client 运行 starthelloclient starthelloclient.bat echo off set CP=f:client;f:clientclasseshello.jar echo using classpath %CP% echo on java -classpath %CP% -Djava.rmi.server.codebase=file:/f:serverclasses/ -Djava.security.policy=rmiclient.policy jdevelop
27、er.rmi.HelloClient %1 rmiclient.policy grant permission .SocketPermission "*:1024-65535", "connect" permission java.io.FilePermission "f:serverclasses-", "read" ; B.以网络方式运行 建立 apache_pathhtdocsrmijdeveloperrmi目录 cd apache_pathhtdocsrmi copy f:serverhello.jar . copy f:serverjdeveloperrmiHelloImpl_Stub.class apache_pathhtdocsrmijdeveloperrmi jar xvf hello.jar 把 starthellohttpserver.bat 和 rmihttpserver.policy 放到f:server 启动新的DOS窗口 运行 starthellohttpserver starthellohttpserver.bat SE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025VIP卡领用合同模板
- 老年团体治疗实施指南
- 四川省遂宁市2024-2025学年高二上学期1月期末生物试题 含解析
- 宝宝班父母课堂教案
- 建筑业“营改增”实施前相关措施的探讨2016.4.2
- 人教版小学英语三年级下册第三单元试卷
- 2025年背阔肌知识试题
- 小学春季学期关爱留守儿童工作总结模版
- 语文教学工作总结(1)-教师工作计划总结模版
- 自我总结模版
- 世界环境日主题班会《生物多样性保护》班会课件
- 智联网汽车技术 课件 13.9自动紧急制动系统
- 危废转运合同范例
- DBJT13-323-2019 土壤固化剂应用技术规程
- 手术患者管路安全管理
- 数字化转型下的对公客户业务场景解析
- 高中化学物质俗名大全
- 2024铁路车站及沿线用摄像机技术要求
- 2025年西昌市公开招聘国企业工作人员高频重点提升(共500题)附带答案详解
- 2025年快速注塑机生产线升级改造合同范本3篇
- 2025届湖北武汉市高考仿真模拟数学试卷含解析
评论
0/150
提交评论