基于-JavaRMI的分布式计算_第1页
基于-JavaRMI的分布式计算_第2页
基于-JavaRMI的分布式计算_第3页
基于-JavaRMI的分布式计算_第4页
基于-JavaRMI的分布式计算_第5页
免费预览已结束,剩余4页可下载查看

下载本文档

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

文档简介

1、 基于Java+RMI的分布式计算摘要:随着网络技术和面向对象技术的日趋成熟,分布式计算已经成为软件设计的主流。面向对象编程语言JAVA使得分布式计算更容易实现。本文首先阐述了分布式计算的概念,接着讨论了RMI(远程方法调用)的编程方法和介绍利用RMI进行分布计算的步骤。最后通过实例来论述如何让RMI实现分布计算。关键字:JAVA语言;RMI;分布式计算;面向对象技术;Abstract:with the maturity of network technology and object- oriented technology, distribute puting has bee mainst

2、ream in softwaredesign. An object-oriented programming language JAVA makes distribute puting easier to implement. We will expounds the conception ofdistribute putingfirst, then discuss about the programming method of RMI(Remoting Method Invocation)and introduce the steps for distribute puting based

3、on RMI.Last we will discuss how to implement distributeputing with RMI by examples.Keywords: JAVA language; RMI; distributeputing; object-oriented;1. 引言由于现代人类各个课题学科繁多,涉及面广,而分类又细。而当今的每个学科似乎都需要进行大量的计算。天文学研究组织需要计算机来分析太空脉冲(pulse),星位移动;生物学家需要计算机来模拟蛋白质的折叠(protein folding)过程;药物学家想要研制克服艾滋病(AIDS)或非典(SARS)的药物

4、;数学家想计算最大的质数和圆周率的更精确值;经济学家要用计算机分析计算在几万种因素考虑下某个企业/城市/国家的发展方向从而宏观调控。由此可见,人类未来的科学,时时刻刻离不开计算。而分布式计算(Distributed puting),以其独特的优点便宜、高效而越来越受到社会的关注。 支持分布式应用软件开发的工具层出不穷,它们都在一定程度上促进了分布式的应用和发展。但是它们在面向对象,安全性和可移植性上存在很大的不足。使得分布式软件的开发仍存在很大的困难。面向对象语言JAVA出现,其平台无关性的优势使得它自身成为Internet上广泛应用的程序语言。在JAVA1.1版本以后推出的RMI,使客户机上

5、的程序可以调用服务器上的远程对象,这样就使程序员能够很容易编写出分布计算程序。2. 分布计算分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。最近的分布式计算项目已经被用于使用世界各地成千上万位志愿者的计算机的闲置计算能力,通过因特网,您可以分析来自外太空的电讯号,寻找隐蔽的黑洞,并探索可能存在的外星智慧生命;您可以寻找超过1000万位数字的梅森质数;您也可以寻找并发现对抗艾滋病病毒的更为有效的药物。这些项目都很庞大,需要惊人的计算量,仅仅由单个的电脑或是个人在一个

6、能让人接受的时间计算完成是决不可能的。 分布式计算是近年提出的一种新的计算方式。所谓分布式计算就是在两个或多个软件互相共享信息,这些软件既可以在同一台计算机上运行,也可以在通过网络连接起来的多台计算机上运行。分布式计算比起其它算法具有以下几个优点:1、稀有资源可以共享。2、通过分布式计算可以在多台计算机上平衡计算负载。3、可以把程序放在最适合运行它的计算机上。其中,共享稀有资源和平衡负载是计算机分布式计算的核心思想之一。3. 分布式通信在分布式系统中,由于缺少共享存储器,系统中的通信都是基于消息传递的。消息传递,物理上复制要共享的数据到另外一个进程的地址空间。3.1 组通信组通信最简单的实现方

7、式就是不可靠组播,即简单地向每个目标发送一条消息。相对的,可靠组播是发送者向一个组中所有成员发送消息,然后等待每一个成员的回复。3.2 远程调用RPCRPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在的应用程序更加容易。RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程

8、发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。运行时,一次客户机对服务器的RPC调用,其部操作大致有十步:(1).调用客户端句柄;执行传送参数(2).调用本地系统核发送网络信息(3).消息传送到远程主机(4).服务器句柄得到消息并取得参数(5).执行远程过程(6).执行的过程将结果返回服务器句柄(7).服务器句柄返回结果,调用远程系统核(8).消息传回本地主机(9).客户句柄

9、有核接收消息(10).客户接收句柄返回的数据。3.3 RPC和RMI的区别RMI和RPC之间最主要的区别在于方法是如何别调用的。在RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。这就向RPC服务器表明,被请求的方法在为“classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参

10、数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。4. RMI技术4.1RMI简介RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址

11、空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。4.2RMI原理RMI主要由三层来构成。每一层的边界由确定的接口和协议加以定义。每一层都独立于下一层,并且可以在不影响系统中其他层的情况下,用可选的实现替代。它的三层结构包括:Stub/Skeleton层;远程引用层;传输层。(1).Stub/Skeleton层:这一层是应用层RMI系统与其它部分之间的接口。客户与本机Stub对象进行交互。远程对象的Stub就是远程对象的客户端代理,它定义了远程对象实现所支持的所有接口,并借助于远程引用层把调用请求传送给服务器对象。(2).远程引用层:主要处理低端传输接I=1也负责执行专门的远程

12、引用协议,这个协议是独立于客户端的存根和服务端的框架之外的。(3).传输层:实现具体的客户端到服务器端的网络连接。主要执行以下动作:建立远程地址空间的连接进行管理和监控连接状态:监听新的调用;建立并维护地址空间的远程对象表:建立新调用的连定位远程调用的调度程序,并建立与此调度程序的连接。在这种体系结构中每个RMI服务都由一个接口定义,该接口描述了可以远程执行的对象方法。可以创建接口的多个实现,而且开发者无需了解使用的是哪个实现以及该实现位于何处。另外用于进行远程调用的对象称为客户机对象,远程对象称为服务器对象:客户机与服务器的职责完全可能在某个位置上互相对换,进行前一个方法调用的服务器本身,在

13、它调用驻留在另一个计算机上的远程方法时将变成客户机。因此,基于这种体系结构开发大型系统时可以将复杂的逻辑处理分散于不同的服务器中更便于分布式系统的开发。 其优点有以下几方面:(1)面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。(2)可移动属性:RMI可将属性(类实现程序)从客户机移动到服务器,或者从服务器移到客户机。(3)安全:RMI采取了Java置的安全机制,可保证下载执行程序时用户系统的安全。(4)可连接现有原有的系统:RMl可通过Java本机方法接口JNI与现有系统进行交互。(5)编写一次,到处运行:RMI是Java“编写一次,到处运行”方法的一部分

14、。任何基于RMI的系统均可100地移植到任何Java虚拟机上,RMIJDBC系统也不例外。(6)分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不再被网络中任何客户程序所引用的远程服务对象。(7)并行计算:RMI采用多线程处理方法,可使服务器利用这些Java线程更好地并行处理客户端的请求。5. JAVA RMI分布计算的步骤基于上节的论述,接下来讨论RMI的实现所需步骤:(1).定义远程接口:这一步是最主要的部分,因为接口是连接服务器和客户机的关键部分。它包含了远程调用所需要的方法。通常在java中只能实现单一继承,而使用接口后可以实现多类继承。为了使用RMI,不仅要继承JAVA的RMI类,

15、还要继承用户自己定义的类。因此使用接口。此类中只定义远程调用方法和变量的声明,而方法的具体实现则由接口派生出来的类来完成。(2).实现远程服务器上接口的方法:定义了服务器接口,下一步就是实现它。这个实现将给出每个方法的功能,也可以定义其他的方法。然后,只能由RMI服务器接口所定义的方法才能远程访问。(3).创建服务器对象的服务器程序:在服务器上首先要创建两个服务器对象。然后使用Namingrebind()方法,将这个对象和一个名称联系(绑定)在一起。这个名称就是客户机查找服务器对象所使用的名称。Naming是javarmi包中的类。这个类的作用是建立一套查找对象的命名机制。通过它就可以将绑定在

16、特定名称上的对象找到。(4).编写客户端代码:创建一个任务,并规定如何执行这个任务。客户只需取得指向远程接口的对象引用,而不需关心怎样发送和接收消息以及服务位置。由于RMI的存在,系统可以做到:可以直接通过名字定位远程方法的位置,可以参数的形式将一个对象传递给一个远程方法可以使一个对象到另外一个虚拟机上运行计算结果可以返回6. JAVA RMI 实现分布计算的实例下面通过一个简单的实例来说明具体实现的方法。创建一个提供RMI服务的远程对象,这个对象只提供一个方法BubbleSort(),调用一个整型数组作为参数,进行冒泡排序后返回结果。然后在客户机上运行客户程序,提供两个整型数组,分别调用远程

17、方法BubbleSort(),最后再将两个已经排好序的数组归并成一个有序数组。本文数组分块思想将第一个数组A(m*l)按列分块,将第二个数组B(l*n)按行分块。A的第一列与B的第一行分块到第一块。做矩阵乘法。乘出的矩阵k1(m*n)。将分块的矩阵都加起来就得到最后的A*B矩阵相乘的结果。不论A,B的矩阵形势是如何?都可以按进程个数循环的将分块交给远程方法执行。本例是3个进程。数组是A(5*3)*B(3*5)最后乘的矩阵C(5*5)(1) 定义一个远程接口:import java.rmi.Remote;import java.rmi.RemoteException;/定义一个远程接口,这个接口

18、应该继承Remote public interface Matrix extends Remote int MatrixMup(int data,int data2) throws RemoteException; / 因为这个方法是远程调用的,所以它应该抛出RemoteException(2) 实现远程服务器上接口的方法import java.rmi.*;import java.rmi.server.UnicastRemoteObject;public class MatrixImpl extends UnicastRemoteObject implements Matrix String

19、name=""public MatrixImpl(String name) throws RemoteException =name; private static final long serialVersionUID = -53L;public int MatrixMup (int data,int data2) throws RemoteException /实现矩阵的分块乘法方法 输入是两个数组的相应块(A的某列,B的对应行)int temp = new int data.lengthdata2.length; for(int i=0;i<d

20、ata.length;i+) for(int j=0;j<data.length;j+) tempij=datai*data2j; return temp;(3) 创建服务器对象的服务器程序:import .MalformedURLException;import java.rmi.*;public class MatrixSever public static void main(String args)throws RemoteException /服务器端注册远程对象 / 服务器端注册远程对象 MatrixImpl p1 = new MatrixImpl("block1&

21、quot;); MatrixImpl p2 = new MatrixImpl("block2"); MatrixImpl p3 = new MatrixImpl("block3"); try Naming.rebind("block1", p1); Naming.rebind("block2", p2); Naming.rebind("block3", p3); / 获得注册的名字列表,并打印出来 String list = Naming.list(""); for (int

22、 i = 0; i < list.length; i+) System.out.println("list" + (i + 1) + "=" + listi); catch(MalformedURLException e) e.printStackTrace(); (4) 客户端代码编写import java.rmi.Naming;public class MatrixClient public static void main(String args) try / 客户端获取远程接口Matrix p1 = (Matrix) Naming.look

23、up("rmi:/localhost:1099/block1");Matrix p2 = (Matrix) Naming.lookup("rmi:/localhost:1099/block2");Matrix p3 = (Matrix) Naming.lookup("rmi:/localhost:1099/block3");/ 调用远程接口的方法int a = 4,2,4,2,1,1,6,6,4,2,4,6,1,1,3;int b = 3,9,1,6,4,4,3,1,5,6,4,5,2,1,5;System.out.println(&

24、quot;数组一:");for(int i=0;i<a.length;i+)for(int j=0;j<a0.length;j+)System.out.printf("%4d", aij);System.out.println();System.out.println("数组二:");for(int i=0;i<b.length;i+)for(int j=0;j<b0.length;j+)System.out.printf("%4d", bij);System.out.println();int su

25、m = null,data1 = null,data2 = null,data3 = null;int len1 = 0;int len2 = 0;for(int k=0;k<3;k+)int temp1 = bk;int temp = new inta.length;for(int i=0;i<a.length;i+)tempi = aik; len1 = temp.length; len2 = temp1.length;if(k=0)data1 =p1.MatrixMup(temp,temp1);System.out.println("第一块");for(i

26、nt x=0;x<data1.length;x+)for(int y=0;y<data10.length;y+)System.out.printf("%4d", data1xy);System.out.println();/sum = MatrixSum(data1,sum);else if(k=1)data2 = p2.MatrixMup(temp,temp1);System.out.println("第二块");for(int x=0;x<data1.length;x+)for(int y=0;y<data10.length;

27、y+)System.out.printf("%4d", data2xy);System.out.println();/sum = MatrixSum(data2,sum);elsedata3 = p3.MatrixMup(temp,temp1);System.out.println("第三块");for(int x=0;x<data1.length;x+)for(int y=0;y<data10.length;y+)System.out.printf("%4d", data3xy);System.out.println();/sum = MatrixSum(data3,sum);/ MatrixSum(data1,data2,data3);System.out.println("结果:"); MatrixSum(data1,data2,data3); catch (Exception e) e.printSta

温馨提示

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

评论

0/150

提交评论