您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > Java远程方法调用.
2020/1/1022:211第11章Java远程方法调用武汉大学计算机学院计算机应用系2020/1/1022:21第2页深入理解RMI实现分布式计算基本原理深入理解RMI服务器端和客户端程序的基本框架熟练掌握编写一个RMI应用的基本步骤熟练运用RMI完成各种分布式计算本章学习要点2020/1/1022:21311.1概述2020/1/1022:21第4页1.什么是RMIJavaRMI(RemoteMethodInvocation远程方法调用)能让一个Java程序调用网络中另外一台计算机上的Java方法,就如同调用本地方法一样。RMI大大增强了Java开发分布式应用的能力,为采用Java实现分布式计算提供了简单而直接的途径。Java强大的威力体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。在某种程度上,RMI可以被看作是RPC的Java版本。JavaRMI可以支持存储于不同地址空间的程序级对象之间彼此进行的通信,实现远程对象之间的无缝远程调用,从而能够比RPC更好地应用于分布式系统。2020/1/1022:21第5页2.RMI的协议及其特点RMI目前使用Java远程消息交换协议JRMP(JavaRemoteMessagingProtocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,JavaRMI也具有Java的“WriteOnce,RunAnywhere”的优点。用JavaRMI开发的应用系统可以在任何支持JRE的平台上运行。RMI是以Java为核心的,所以它将Java的安全性和可移植性等强大功能带给了分布式计算。RMI可将Agent和服务逻辑等属性移动到网络中最合适的地方。RMI可利用标准Java本机接口(JNI)与现有的和原有的系统相连接。RMI还可利用标准JDBC包与现有的关系数据库连接。RMI/JNI和RMI/JDBC相结合,可帮助用户利用RMI与目前使用非Java语言的服务器进行通信。2020/1/1022:21第6页3.RMI的结构RMI应用程序通常包括两个独立的程序:服务器程序和客户机程序。·典型的服务器应用程序可以创建多个远程对象,并使这些远程对象能够被引用,然后等待客户机调用这些远程对象上的方法。·典型的客户机程序则从服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。这种类型的应用程序通常被称为分布式对象应用程序。RMI中的“客户/服务器”仅适用于被调用方法的当前调用过程,它们之间客户/服务器的角色不是固定的。运行调用远程方法的计算机本次是客户机,而处理这些被调用对象的计算机则是本次调用的服务器,它们在下一个调用中还可能互换角色。2020/1/1022:21711.2一个简单的RMI应用实例2020/1/1022:21第8页9.6一个RMI的分布式应用的实例用RMI编写一个分布式应用,核心有以下三方面:定位远程对象1.一个应用可以利用RMI的名字服务功能注册器远程对象。2.可以象操作普通对象一样传送并返回一个远程对象的引用(指针)。与远程对象通信:底层的通信由RMI实现,对于系统开发人员来说,远程调用和标准的Java方法调用没有什么区别。为需要传递的对象装载类的字节码RMI允许调用者向远程对象传递一个对象,因此RMI提供这种装载对象的机制。2020/1/1022:21第9页9.6一个RMI的分布式应用的实例实现一个RMI应用程序需要完成以下几个步骤:1.定义一个接口扩展远程接口,再定义一个类实现它,同时实现服务器端程序,为远程方法调用提供服务。2.完成客户端程序,在该程序中实现远程方法调用。3.上述代码编译通过以后,调用rmic命令生成相应的存根(Stub)类和框架(Skel)类。4.设置服务器,为运行分布式应用程序作好准备(如果该程序仅在本地机上运行则不需此步)。5.在服务器上运行RMI注册程序rmiregistry。6.分别执行服务器程序和客户机程序。2020/1/1022:21第10页9.6一个RMI的分布式应用的实例【例11.1】这个RMI应用是客户机端调用远程方法FirstMethod(),调用的结果是在客户机端的屏幕上打印:Nicetomeetyou!与此同时,该方法在服务器端执行的结果是对静态变量number加1,以模拟一个计数器,并在服务器端的屏幕上显示FirstMethod()方法当前被调用的次数。2020/1/1022:21第11页9.6一个RMI的分布式应用的实例依照上述的步骤1,先定义一个接口扩展远程接口Remote,再定义一个类实现它,同时实现服务器端程序,为远程方法调用提供服务//RemoteInterface.javaimportjava.rmi.*;publicinterfaceRemoteInterfaceextendsRemote{StringFirstMethod()throwsRemoteException;}2020/1/1022:21第12页9.6一个RMI的分布式应用的实例importjava.rmi.*;importjava.rmi.server.*;publicclassFirstImplextendsUnicastRemoteObjectimplementsRemoteInterface{staticintnumber=0;publicFirstImpl()throwsRemoteException{super();}publicStringFirstMethod(){number++;System.out.println(Thisisthe+number+thinvocation!);returnNicetomeetyou!;}}2020/1/1022:21第13页9.6一个RMI的分布式应用的实例RemoteInterface接口的访问类型必须是public,原因是在客户端和服务端都要使用它。·远程接口必须扩展(继承)java.rmi.Remote接口,只有在远程接口中定义的方法才能被远程调用。·在远程接口的实现类FirstImpl中还可能定义了其他的方法,也不能被远程调用,只有在RemoteInterface接口中说明的方法(如上述的FirstMethod()方法)才能被远程调用。·远程接口中定义的FirstMethod()方法可能在被调用时出现很多异常,如服务器关闭、网络不通等,所以要抛出RemoteException,并且要出现在throws子句之中。·远程接口的实现类FirstImpl要求扩展java.rmi.unicastRemoteObject或java.rmi.activation.Activable。2020/1/1022:21第14页9.6一个RMI的分布式应用的实例服务器程序的最后一个程序//FirstServer.javaimportjava.rmi.*;importjava.rmi.server.*;publicclassFirstServer{publicstaticvoidmain(String[]args)throwsException{RemoteInterfaceobject=newFirstImpl();Naming.rebind(rmi://127.0.0.1/RemoteServer,object);System.out.println(Iamready!);}}2020/1/1022:21第15页9.6一个RMI的分布式应用的实例程序首先调用远程接口的实现类FirstImpl的构造方法建立一个远程对象。一旦生成这个对象,然后让一个URL格式的名字与该远程对象的引用绑定在一起,就意味着可以接受远程调用。需要说明的是,我们所使用的URL地址是127.0.0.1,在单机上调试RMI程序可使用它;否则,应该改为服务器的URL地址。最后在服务器端的屏幕上输出“Iamready”,这样服务器端的程序就完成了。2020/1/1022:21第16页9.6一个RMI的分布式应用的实例第2步:实现客户端程序。//FirstClient.javaimportjava.rmi.server.*;importjava.rmi.Naming;publicclassFirstClient{publicstaticvoidmain(String[]args)throwsException{RemoteInterfacelocalobject=(RemoteInterface)Naming.lookup(rmi://127.0.0.1/RemoteServer);Strings=localobject.FirstMethod();System.out.println(s);System.out.println(Iamalsoready!);}}2020/1/1022:21第17页9.6一个RMI的分布式应用的实例这个程序首先从rmiregistry中获得远程对象(RemoteServer)的一个引用localobject。然后通过它调用远程对象的FirstMethod()方法。并将调用该方法的结果打印在客户端的屏幕上。为了该RMI程序能在本地一台计算机上运行,可将上述的4个程序放在同一个目录下面,在这个目录下将上述的4个程序利用下面的命令进行编译:javacRemoteInterface.javaFirstImpl.javaFirstServer.javaFirstClient.java或javac*.java编译成功,则应该在当前目录下生成4个相对应的.class文件。2020/1/1022:21第18页9.6一个RMI的分布式应用的实例第3步:调用rmic命令生成相应的用于客户端的存根(Stub)类和用于服务器端的框架(Skel)类,可在当前目录下运行下面的命令:rmicFirstImpl若该命令正常执行,则应该在当前目录下生成文件名为FirstImplclass_Skel和FirstImplclass_Stub的两个.class文件。若上述两个命令(javac和rmic)不能正常执行,则应该检查一下JDK的CLASSPATH是否设置正确。第4步:对客户端路径,服务器端路径进行配置。(见11.3.5)本程序是在本地机上运行的,则可以不用考虑服务器的配置问题。即上述步骤中第4步可以跳过。2020/1/1022:21第19页9.6一个RMI的分布式应用的实例第5步,在当前目录下运行下面的命令:rmiregistry或startrmiregistry或javawrmiregistryrmiregistry是JDK中的一个可执行文件,它的功能是启动RMI注册表。该程序一般在服务器端的后台执行,它不产生输出。rmiregistry命令应该在存放以上程序的目录下运行,并且建议最好不用javawrmiregistry命令,Windows对它支持不够。这体现在两个方面:一是不易看到它的执行信息;二是无法安全关闭该新开的窗口。要安全关闭用rmiregistry或startrmiregistry命令新打开的窗口,可先按Ctrl+C键停止该程序的执行,然后再关闭。2020/1/1022:21第20页9.6一个RMI的分布式应用的实例第6步,运行服务器端和客户端程序。先运行服务器端的程序FirstServer.class:javaFirstServer由运行的状态可知,该程序执行后并没有退出,而是处于等待状态。2020/1/1022:21第21页9.6一个RMI的分布式应用的实例下面再在一个新的控
本文标题:Java远程方法调用.
链接地址:https://www.777doc.com/doc-2881598 .html