JavaRMI-10-6-北大计算机系java培训讲义_第1页
JavaRMI-10-6-北大计算机系java培训讲义_第2页
JavaRMI-10-6-北大计算机系java培训讲义_第3页
JavaRMI-10-6-北大计算机系java培训讲义_第4页
JavaRMI-10-6-北大计算机系java培训讲义_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、9.6 一个RMI的分布式应用的实例用RMI编写一个分布式应用,核心有以下三方面:定位远程对象1. 一个应用可以利用RMI的名字服务功能注册器远程对象。2. 可以象操作普通对象一样传送并返回一个远程对象的引用(指针)。与远程对象通信:底层的通信由RMI实现,对于系统开发人员来说,远程调用和标准的Java方法调用没有什么区别。为需要传递的对象装载类的字节码RMI允许调用者向远程对象传递一个对象,因此 RMI提供这种装载对象的机制。1本资源由 寒秀草与巧克力 搜集与网络请您在传播的时候将下载分数设为0真正体现资源共享的理念谢谢更多0分资料去我的文库29.6 一个RMI的分布式应用的实例Web Se

2、rverClient ServerWeb ServerregistryURL protocolRMIRMIURL protocolURL protocolRMI39.6 一个RMI的分布式应用的实例Compute enginServerRemote objectClienttaskClienttaskClienttask 一、问题的提出49.6 一个RMI的分布式应用的实例分布特点:engin开发,先运行,task后定义.写engin时不对执行什么任务作任何规定.任务可以是任意定制的.前提条件:定义任务的类,要规定任务的实现步骤,使得这个任务能够提交给engin去执行.使用server上的 C

3、PU资源. 技术支持:RMI的动态装载功能.59.6 一个RMI的分布式应用的实例远程对象clientserverAm1远程方法A.m1()远程对象必须继承远程接口确定那些方法是远程方法,为此定义远程接口远程接口只负责提供方法名,不一共实现细节,因此必须由一个对象来实现接口executeTaskcomputeengineComputeexecuteTask69.6 一个RMI的分布式应用的实例二、设计一个服务器核心协议:提交任务,执行任务,返回结果clientclient在java中远程调用是通过定义远程接口来实现的, 一个接口只能有一个方法不同类型的任务,只要他们实现了Task类型,就可以在

4、engin上运行.实现这个接口的类,可以包含任何任务计算需要的数据以及和任何任务计算需要的方法.79.6 一个RMI的分布式应用的实例(1)定义远程接口第一个接口:computepackage compute;import java.rmi.Remote;import java.rmi.RemoteException;public interface Compute extends Remote Object executeTask(Task t) throws RemoteException;package compute;import java.io.Serializable;public

5、 interface Task extends Serializable Object execute(); 第二个接口:定义一个task类型,作为参数传给executeTask方法,规定了engin与它的任务之间的接口,以及如何启动它的任务.它 不是一个远程接口executeTaskcomputeengineComputeexecuteTask89.6 一个RMI的分布式应用的实例Compute engin的设计要考虑以下问题:1. compute engine是一个类 ComputeEngine ,它实现了 Compute接口,只要调用该类的方法executeTask, 任务就能提交上来.

6、2. 提交任务的Client 端程序并不知道任务是被下载到engin上执行的.因此client在定义任务时并不需要包含如何安装的server端的代码.3. 返回类型是对象,如果结果是基本类型,需要转化成相应的对等类.4. 用规定任务如何执行的代码填写execute方法. 99.6 一个RMI的分布式应用的实例(2)实现远程接口一般说来,实现一个远程接口的类至少有以下步骤:1. 声明远程接口2. 为远程对象定义构造函数3. 实现远程方法engin中创建对象的工作可以在实现远程接口类的main函数中实现:1. 创建并安装安全管理器2. 创建一个或更多的远程对象的实例3. 至少注册一个远程对象109

7、.6 一个RMI的分布式应用的实例package engine;import java.rmi.*; import java.rmi.server.*; import compute.*;public class ComputeEngine extends UnicastRemoteObject implements Compute public ComputeEngine() throws RemoteException super(); public Object executeTask(Task t) return t.execute(); public static void main

8、(String args) if (System.getSecurityManager() = null) System.setSecurityManager(new RMISecurityManager(); String name = /host/Compute; try Compute engine = new ComputeEngine(); Naming.rebind(name, engine); System.out.println(ComputeEngine bound); catch (Exception e) System.err.println(ComputeEngine

9、exception: + e.getMessage(); e.printStackTrace(); 119.6 一个RMI的分布式应用的实例在构造函数中,通过super(), a UnicastRemoteObject 被启动,即它可以侦听客户端来的请求输入只有一个远程方法,参数是客户端远程调用这个方法时传来的任务.这个任务被下载到engin,远程方法的内容就是调用客户端任务的方法,并把结果回送给调用者.实际上这个结果是在客户的任务的方法中体现的.executeTaskcomputeengineComputeexecuteTaskcallexecuteTask(task)129.6 一个RMI

10、的分布式应用的实例参数传递规则:1. 远程对象通常通过引用传递.一个远程对象的引用是一个stub,它是客户端的代理.它实现远程对象中的远程接口的内容2. 本地对象通过串行化拷贝到目的. 如果不作制定,对象的所有成员都将被拷贝. 139.6 一个RMI的分布式应用的实例通过引用传递一个对象,意味着任何由于远程调用引起的变化都能反映在原始的对象中。当传递一个远程对象时,只有远程接口是可用的, 而在实现类中定义的方法或者是非远程接口中的方法,对接收者来说是不可用的在远程方法调用中,参数,返回值,异常等非对象是值传送. 这意味着对象的拷贝被传送到接受方。任何在对象上发生的变化不影响原始的对象一旦服务器

11、用rmi注册了,main方法就存在了,不需要一个守护线程工作维护服务器的工作状态,只要有一个computer engin的引用在另一个虚拟机,computer engin就不会关闭149.6 一个RMI的分布式应用的实例三、实现一个客户程序目标:创建一个任务,并规定如何执行这个任务。clientPicomputePipackage compute;public interface Task extends java.io.Serializable Object execute();task不是远程接口,但是需要传递到服务器,因此用串行化ExecuteTask()execute()159.6 一

12、个RMI的分布式应用的实例computePi的作用装载安全管理器生成一个远程对象 comp生成任务对象Look up(ComputeEngin),获得了stubsPi task=new Pi()调用ComputeEngin的远程方法获得计算结果Comp.executeTask(task)169.6 一个RMI的分布式应用的实例package client;import java.rmi.*; import java.math.*; import compute.*;public class ComputePi public static void main(String args) if (S

13、ystem.getSecurityManager() = null) System.setSecurityManager(new RMISecurityManager(); try String name = / + args0 + /Compute; Compute comp = (Compute) Naming.lookup(name); Pi task = new Pi(Integer.parseInt(args1); BigDecimal pi = (BigDecimal) (comp.executeTask(task); System.out.println(pi); catch (

14、Exception e) System.err.println(ComputePi exception: + e.getMessage(); e.printStackTrace(); 179.6 一个RMI的分布式应用的实例Pi的作用computepirmiregistryCompute engin实现Task接口实现execute算法189.6 一个RMI的分布式应用的实例package client; import compute.*; import java.math.*;public class Pi implements Task private static final BigDe

15、cimal ZERO = BigDecimal.valueOf(0); private static final BigDecimal ONE = BigDecimal.valueOf(1); private static final BigDecimal FOUR = BigDecimal.valueOf(4); private static final int roundingMode = BigDecimal.ROUND_HALF_EVEN; public Pi(int digits) this.digits = digits; 199.6 一个RMI的分布式应用的实例public Ob

16、ject execute() return computePi(digits); * pi/4 = 4*arctan(1/5) - arctan(1/239)*public static BigDecimal computePi(int digits) int scale = digits + 5; BigDecimal arctan1_5 = arctan(5, scale); BigDecimal arctan1_239 = arctan(239, scale); BigDecimal piarctan1_5.multiply(FOUR).subtract(arctan1_239).mul

17、tiply(FOUR); return pi.setScale(digits, BigDecimal.ROUND_HALF_UP); 209.6 一个RMI的分布式应用的实例 /* * Compute the value, in radians, of the arctangent of * the inverse of the supplied integer to the speficied * number of digits after the decimal point. The value * is computed using the power series expansion

18、 for the * arctangent: * arctan(x) = x - (x3)/3 + (x5)/5 - (x7)/7 + * (x9)/9 . */ 219.6 一个RMI的分布式应用的实例public static BigDecimal arctan(int inverseX, int scale) BigDecimal result, numer, term; BigDecimal invX = BigDecimal.valueOf(inverseX); BigDecimal invX2 = BigDecimal.valueOf(inverseX * inverseX); n

19、umer = ONE.divide(invX, scale, roundingMode); result = numer; int i = 1; do numer =numer.divide(invX2, scale, roundingMode); int denom = 2 * i + 1; term = numer.divide(BigDecimal.valueOf(denom), scale, roundingMode); if (i % 2) != 0) result = result.subtract(term); else result = result.add(term); i+

20、; while (pareTo(ZERO) != 0); return result; 229.6 一个RMI的分布式应用的实例由于Rmi的存在,系统可以做到:1、可以直接通过名字定位远程方法的位置2、以参数的形式将一个对象传递给一个远程方法3、可以使一个对象到另外一个虚拟机上运行4、计算结果可以返回239.6 一个RMI的分布式应用的实例将接口,远程对象,客户代码分成三个程序包:1. compute ( Compute and Task interfaces) 2. engine ( ComputeEngine implementation class and its stub) 3. cl

21、ient ( ComputePi client code and Pi task implementation) 249.6 一个RMI的分布式应用的实例接口compute对于编程双方都是需要的,通常将接口文件打成包,分发给server和client的开发者: 假设接口的开发者将写好的接口程序放在c:homewaldosrccompute目录下cd c:homewaldosrcjavac computeCompute.javajavac computeTask.javajar cvf compute.jar compute*.class259.6 一个RMI的分布式应用的实例类文件必须是网络可

22、访问的,rmi利用URL定位类文件假设 ComputeEngine.java 存放在 c:homeannsrcengine 假设 compute.jar存放在 c:homeannpublic_htmlclasses. 设置环境变量CLASSPATH=c:homeannsrc;c:homeannpublic_htmlclassescompute.jar269.6 一个RMI的分布式应用的实例编译 ComputeEngine.java,产生一个 stub,并使stub是网络可访问的. 产生stub的命令是rmic,生成的文件形式为: className_Stubs.class和className_

23、skeleton.class命令如下:cd c:homeannsrcjavac engineComputeEngine.javarmic -d . engine.ComputeEnginemd c:homeannpublic_htmlclassesenginecopy engineComputeEngine_*.class c:homeannpublic_htmlclassesengine279.6 一个RMI的分布式应用的实例展开接口文件cd c:homeannpublic_htmlclassesjar xvf compute.jar289.6 一个RMI的分布式应用的实例执行程序1. 在启

24、动compute engine之前, 首先要启动RMI的 registry。unset CLASSPATHstart rmiregistry2. 启动Server.确认compute.jar文件和实现远程对象的类在指定的class路径下set CLASSPATH=c:homeannsrc;c:homeannpublic_htmlclassescompute.jar299.6 一个RMI的分布式应用的实例启动 compute engine时,要规定服务器端的类在什么情况下是可用的。启动Compute enginejava -Djava.rmi.server.codebase= :homeannp

25、ublic_htmlclasses/ -Djava.rmi.server.hostname= -Djava.security.policy=java.policy engine.ComputeEngine 309.6 一个RMI的分布式应用的实例3. 启动 Client指定类(pi)的位置 set CLASSPATH=c:homejonessrc;c:homejonespublic_htmlclassescompute.jar-java -Djava.rmi.server.codebase= :homejonespublic_htmlclasses/ -Djava.security.polic

26、y=java.policyclient.ComputePi localhost 20输入完上述命令后,得到结果 3.149323846319.6 一个RMI的分布式应用的实例329.7 基于CORBA的分布式应用系统的实例windowsNT(C+)Sun(Java)Netscape(COBOL)client339.7 基于CORBA的分布式应用系统的实例CORBA技术和Java技术的结合-Java IDL什么是IDL?IDL是CORBA规范中的接口定义语言,不依赖于任何具体的编程语言.CORBA提供了到各种不同语言的IDL映射.Java IDL是CORBA到Java的映射,使Java也支持CO

27、RBA规范Java IDL和Java RMI非常相似,RMI只支持Java语言写的分布对象,Java IDL可以和CORBA支持的任何一种语言编写的ORB对象进行交互Java RMI和Java IDL目前使用的通信协议不同,分别是JRMP和IIOP.349.7 基于CORBA的分布式应用系统的实例在Java IDL中,客户端通过引用与远程的对象进行交互,即客户机使用stubs对远程服务器上的对象进行操作,但并不拷贝服务器上的对象.Java RMI即可以通过引用,也可以将对象下载到本地机上运行(因为有串行化功能).Java实现简单,但语言不兼容Java IDL则可以充分发挥语言无关的优势359.

28、7 基于CORBA的分布式应用系统的实例IDL Java的技术组成:IDL至Java的编译器:idltojava生成客户端的stubs和服务器端的skeletonCORBA API 和 ORB一个简单的名字服务369.7 基于CORBA的分布式应用系统的实例IDL接口IDL编译器(C+, Java)服务程序IDL Stub客户应用对象实现SkeletonC+, Java编译器C+, Java编译器客户程序应用开发者379.7 基于CORBA的分布式应用系统的实例ORB内核BOAIDL SkeletonIDL文件IDL编译器对象实现应用开发者事件感知部分事件适配部分 事件处理分发部分 事件处理部

29、分从反应式Agent的角度看389.7 基于CORBA的分布式应用系统的实例CORBA编程实例运行在浏览器中的客户对象与远程的服务对象交互,客户端的表现是在浏览器中点击一个button,就会在一个文本域中返回服务端的时间,同时也在服务端的标准输出上打印该时间。buttonThe data in server side is2000.6.112:56:00server时间是一个对象399.7 基于CORBA的分布式应用系统的实例ORBCLIENTSTUBSSKELETONSSERVERORBIIOPMETHOD REQUESTOBJECT REFERENCESERVANT409.7 基于CORB

30、A的分布式应用系统的实例1. 首先是定义交互接口,在文件dateit.idl中。module TheDate (相当于包) interface DateIt string dateit(); ;2. 用IDL接口到Java语言的映射jidl dateit.idl 该命令会生成几个相关的java文件:DateIt.javaDateItHelper.javaDateItHolder.java _DateItImplBase.javaStubForDateIt.java419.7 基于CORBA的分布式应用系统的实例3. 编写服务对象的程序,在文件DateIt_impl.java中package T

31、heDate; / jidl 产生的Java文件放在TheDate包中import org.omg.CORBA.*; import java.io.*;import java.awt.*;import java.util.Date;import java.lang.System;public class DateIt_impl extends _DateItImplBase /扩展了 jidl 生成的抽象类_DateItImplBase String date_time; public String dateit() date_time=(new Date().toString(); /获取时

32、间 System.out.println(date_time); return date_time;/ 向客户端返回时间串 429.7 基于CORBA的分布式应用系统的实例4. 编写服务方的程序,在文件Server.java中。package TheDate; import org.omg.CORBA.*;import java.io.*;public class Server public static void main(String args) try / 创建ORB和BOA对象实例 ORB orb = ORB.init(args, new java.util.Properties();

33、 / 生成服务对象实例 BOA boa = orb.BOA_init(args); DateIt_impl p = new DateIt_impl(); /创建服务对象实例439.7 基于CORBA的分布式应用系统的实例/ 保存引用try String ref = orb.object_to_string(p); /将对象编码成字符串 String refFile = date.ref; file = new (refFile); PrintStream out = new PrintStream(file); out.println(ref); /存入文件date.ref中 out.flus

34、h(); (); catch(IOException ex) System.err.println(Cant write to +ex.getMessage(); System.exit(1); 449.7 基于CORBA的分布式应用系统的实例/将引用存入html文件中,参见后面列出的date.html 文try String ref = orb.object_to_string(p); String refFile = c:InetpubDocsdate.html; file = new (refFile); PrintStream out = new PrintStream(file);

35、out.println(); 459.7 基于CORBA的分布式应用系统的实例/指由Client.java编译成的class文件out.println(); /将由服务对象转化成的字符串存入超文本文件中out.println();out.println();name=org.omg.CORBA.ORBSingletonClass + value out.println();out.flush(); (); /这样浏览器调入该超文本页面时,会运行Client.class的applet,并将包含标识服务对象的字符串由参数ior传递给applet。 catch(IOException ex) System.err.println(“Cant write to ”+ex.getMessage()+“”); System.exit(1); 469.7 基于CORBA的分布式应用系统的实例/ 服务对象就绪,准备接受请boa.impl_is_ready(null); System.exit(0); catch(S

温馨提示

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

评论

0/150

提交评论