您好,欢迎访问三七文档
实验十RMI实验一.本实验目的及要求:1.了解分布式计算的概念,了解什么是CORBA、DCOM和RMI的概念2.掌握RMI的工作原理3.掌握RMI的设计和使用方法。4.掌握RMI的运行流程,掌握什么是策略文件。5.实验报告内容应包括,本实验的第三、四、五部分的答案,以及第六部分的程序后要求。二.基础知识分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。常见的分布式技术有:CORBA、DCOM和RMI。其中,面向对象的远程方法调用(RemoteMethodInvocation,RMI)是EnterpriseJavaBeans的支柱技术,是建立分布式Java应用程序的方便途径。RMI是Java的一组开发分布式应用程序的API,它使用Java语言接口定义了远程对象,集合了Java序列化和Java远程方法协议(JavaRemoteMethodProtocol)。通过RMI技术,使原先的程序在同一操作系统的方法调用,变成了不同操作系统之间程序的方法调用。由于J2EE是分布式程序平台,它的RMI机制允许程序组件在不同操作系统之间的通信。比如,一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。在与远程对象的通信过程中,RMI使用标准机制:桩stub和架构skeleton。桩和架构是应用程序与系统其他部分的接口,它们使用RMI的rmic编译器产生。桩通常负责:初始化远程调用、序列化、远程方法调用、反序列化、远程方法调用完成等;构架负责:反序列化客户端参数、调用实际远程对象、序列化返回客户端参数。开发工具包包括:java.rmi客户端的rmi类,接口和异常java.rmi.sever服务器端的rmi类,接口和异常java.rmi.registry用于管理rmi命名服务的类java.rmi.dgc用于管理分布式垃圾收集的类java.rmi.activation用于按需激活的rmi服务的类应用工具有:Rmic.exe编译器,生成stub和skeletonrmiregistry.exe为rmi提供命名服务的服务器,这项服务把名字和对象关联在一起rmid.exe支持rmi激活框架的服务器RMI实现流程1、生成一个远程接口。所有的远程服务都需要继承Remote接口,该接口是一个不定义方法的标记接口,其全部内容只有一行publicinterfaceRemote{}。2、实现远程对象(服务器端程序),该类需要继承UnicastRemoteObject,并实现远程服务接口,而且还要使用RMISecurityManager;3、生成桩程序和架构(服务器端程序);4、编写服务器程序;5、编写客户程序;6、注册远程对象;7、启动远程对象。RMI在Windows下运行步骤,一共分为5步,分别是:1.进入命令行窗口,进入自己项目的文件夹内javac*.java2.使用rmicserverName产生serverName_Stub.class的文件3.使用startrmiregistry[port]4.输入java-Djava.security.policy=policyNameserverName运行服务器5.如果成功另外打开一个命令行窗口进入自己项目文件夹输入java-Djava.security.policy=policyNameclientName(注意,有的时候要在后面加上参数localhost)在RMI中,策略文件是一个文本文件,里面记录了一些对计算机资源访问的方式;比如对本地文件的访问控制,对端口的访问控制等。其文件后缀名为”*.policy”。系统策略文件的缺省位置为:java_jre.home/lib/security/java.policy(Solaris),java_jre.home\lib\security\java.policy(Windows),其格式为:grant{permissionjava.net.SocketPermission*:1024-65535,connect,accept;permissionjava.net.SocketPermission*:80,connect;};为了差别不同的安全策略,可建立自己的策略文件,如c:\MyPolicy.policy,假设运行本地的TCP2005端口可以连接、接受连接和解析,则内容为:grant{permissionjava.net.SocketPermissionlocalhost:2005,connect,accept,resolve;}当运行RMI服务器程序时,指定了安全策略文件java-Djava.security.policy=c:\MyPolicy.policyrmiServer三.概念填空1.分布式计算是一门计算机科学,著名解决方案有公共对象请求代理体系结构(CORBA)、微软事务服务器(MTS)、远程方法调用(RMI)。2.RMI应用程序通常包括两个独立的程序,分别是(服务器端程序)和(客户机端程序),RMI在服务器和客户机进行远程通信和信息传递提供的标准机制,即(桩)和(构架)。3.RMI的系统结构由三个部分组成,分别是(桩/构架层)、(远程引用层)和(传输层)。4.在RMI中,生成桩和框架的程序是(rmicrmiExampl),进行远程服务注册的程序是(startrmiregistry)。在RMI安全中需要策略文件,默认的策略文件是在Java_RJE目录下的lib\security的(java.policy),也可以自定义策略文件,其后缀名必须是(*.policy)。四、程序填空1.声明一个远程对象import(java.rmi.*);(public)interfaceArith(extends)java.rmi.Remote{int[]add(inta[],intb[])(throws)java.rmi.RemoteException;}2.声明一个服务器端对象importjava.rmi.*;import(java.rmi.server.UnicastRemoteObject)classArithImpl(extends)UnicastRemoteObject(implements)Arith{privateStringobjectName;publicArithImpl(Strings)throwsRemoteException{objectName=s;}publicint[]add(inta[],intb[]){intc[]=newint[10];for(inti=0;i10;i++)c[i]=a[i]+b[i];returnc;}publicstaticvoidmain(Stringargv[]){(RMISecurityManager)sm=newRMISecurityManager();System.setSecurityManager(sm);try{ArithImplobj=newArithImpl(ArithServer);Naming.(rebind)(//localhost:3000/ArithServer,obj);System.out.println(ArithServer注册成功);}catch(Exceptione){System.err.println(e.toString());}}}3.客户端程序importjava.rmi.*;importjava.net.*;classArithApp{publicstaticvoidmain(String[]argv){inta[]={1,2,3,4,5,6,7,8,9,10};intb[]={1,2,3,4,5,6,7,8,9,10};intresult[]=newint[10];try{Arithobj=(Arith)Naming.lookup(//localhost:3000/ArithServer);result=obj.add(a,b);}catch(Exceptione){System.err.println(e.toString());}System.out.print(Thesum=);for(inti=0;iresult.length;i++){System.out.println(result[i]+);}System.out.println();}}五、实验内容RMI:面向对象的远程方法调用(RemoteMethodInvocation)是EnterpriseJavaBeans的支柱,是建立分布式Java应用程序的方便途径。1.编写RMI基础//实现一个Remote接口importjava.rmi.*;publicinterfaceArithextendsjava.rmi.Remote{int[]add(inta[],intb[])throwsjava.rmi.RemoteException;}远程接口定义说明了服务器提供的方法特性,包含了方法的名字和参数。这样的接口必备的特性:必须声明为public必须extendsjava.rmi.Remote接口异常处理时,必须throwsjava.rmi.RemoteException//服务器端,实现一个RMI服务importjava.rmi.*;importjava.rmi.server.UnicastRemoteObject;publicclassArithImplextendsUnicastRemoteObjectimplementsArith{privateStringobjectName;publicArithImpl(Strings)throwsRemoteException{super();objectName=s;}publicint[]add(inta[],intb[]){//服务内容是将两个组中对应元素累加intc[]=newint[10];for(inti=0;i10;i++)c[i]=a[i]+b[i];returnc;}publicstaticvoidmain(Stringargv[]){RMISecurityManagersm=newRMISecurityManager();System.setSecurityManager(sm);//设置访问安全管理器try{ArithImplobj=newArithImpl(ArithServer);//注册RMI服务名Naming.rebind(//localhost:3000/ArithServer,obj);//绑定服务端口System.out.println(ArithServerboundinregistry);}catch(Exceptione){System.out.println(ArithServererror+e.getMessage());e.printStackTrace();}}}//客户端,访问指定的服务器端importjava.rmi.*;importjava.net.*;publicclassArithApp{publicstaticvoidmain(String[]argv){inta[]={1,2,3,4,5,6,7,8,9,10};//需要累加的数据intb[]={1,2,3,4,5,6,7,8,9,10};intresult[]=newint[10];try{Arithobj=(Arith)Naming.lookup(//localhost:3000/ArithServer);//查找指定服务result=obj.add(a,b);//调用RMI服务}catch(Exceptione){System.out.println(ArithServererror+e.getMessage());e.printStackTrace();}S
本文标题:实验10-RMI
链接地址:https://www.777doc.com/doc-6365708 .html