1、计算机科学与技术班级计算机1班地点520工作室教师 李 萌一、实验目的:了解RMI的调用过程及其使用方法。二、实验要求和内容:实现远程方法(RMI)调用,编写RMI客户端程序和RMI服务器端程序。通过RMI客户端访问RMI服务器端的方法。三、实验平台:操作系统:Windows 7编程工具:MyEclipse四、实验步骤:1、创建远程接口及声明远程方法(HelloInterface.java )2、实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)3、启动RMI注册服务,并注册远程对象(HelloServer.java )4、客户端查找远程对象,并调用远
2、程方法(HelloClient.java)5、执行程序:启动服务HelloServer;运行客户端HelloClient进行调用五、程序代码: 1、创建远程接口及声明远程方法(HelloInterface.java)import java.rmi.*; /*远程接口必须扩展接口java.rmi.Remote*/ public interface HelloInterface extends Remote /*远程接口方法必须抛出 java.rmi.RemoteException*/ public String say() throws RemoteException; 2、实现远程接口及远程方
3、法(继承UnicastRemoteObject)(Hello.java)import java.rmi.server.*;/*扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface*/ public class Hello extends UnicastRemoteObject implements HelloInterface private String message; /*必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常 */ public Hello(String msg) thro
4、ws RemoteException message=msg; /*远程接口方法的实现 */ public String say() throws RemoteException System.out.println(Called by HelloClient!); return message; 3、启动RMI注册服务,并注册远程对象(HelloServer.java)import java.rmi.Naming;import java.rmi.registry.LocateRegistry;public class HelloServer /*启动 RMI注册服务并进行对象注册 */ pu
5、blic static void main(String argv) try /*启动RMI注册服务,指定端口为1099 1099为默认端口)*/ LocateRegistry.createRegistry(1099); /*创建远程对象的一个或多个实例,下面是 hello对象*/ /*可以用不同名字注册不同的实例 */ HelloInterface hello=new Hello(Hello everyone!My name is xie zhi xing. /*把hello注册到 RMI注册服务器上,命名为 Hello*/ Naming.rebind(Hello,hello); /*如果要
6、把 hello实例注册到另一台启动了 RMI 注册服务的机器上 */ /*Naming.rebind(/192.168.1.105:1099/Hello*/ System.out.println(Hello Server is ready now! catch (Exception e) System.out.println(Hello Server failed: +e); 4、客户端查找远程对象,并调用远程方法(HelloClient.java)public class HelloClient /*查找远程对象并调用远程方法 */ try HelloInterface hello=(Hel
7、loInterface)Naming.lookup( /*如果要从另一台启动了 RMI 注册服务的机器上查找 hello实例*/ /*HelloInterface hello=(HelloInterface)Naming.lookup( /*调用远程方法 */ System.out.println(hello.say(); catch(Exception e) HelloClient exception: 六、实验运行结果: 1、启动服务HelloServer 2、运行客户端HelloClient进行调用 3、运行客户端调用后的服务器端七、实验总结分析:本次实验中并没有用到JDK 所带的命令r
8、mic编译实现类得到存根(Stub) 类,也没用命令rmiregistry命令来启动RMI注册服务。在启动rmiregistry之前必须能让它加载到相应的stub类,这就是造成*_Stub类找不到的原因。如果只是按上面的代码,则服务程序HelloServer客户端程序 HelloClient都必须运行在本机 (如此则RMI有何意义呢?);别急,只要修改 HelloClient 类,使用第二种形式的 lookup 查找语句,注释第一条lookup 语句,取消注释第二条 lookup 语句其中的IP 地址和端口号1099为RMI注册服务器的IP和端口号,这样HelloClient 就可以在另一台机
9、器运行了,当然 HelloInterface 类必须能找到(但也可指定参数Djava.rmi.server.codebase 从网络加载HelloInterface类)。lookup() 默认为从本机127.0.0.1的1099端口上查找Hello命令对象,如果第二条语句写成lookup(192.168.1.105/Hello) 与原语句是同等的,因为默认端口号就是1099。代码中HelloServer和HelloClient省略了设置安全管理器的过程 System.setSecurityManager(newRMISecurityManager(); ,如果设置的安全管理则必须编写相应的访问
10、策略文件,并且在执行时指定参数,无论是启动服务端还是客户端都可以用参数 Djava.rmi.server.codebase=http:/unmi.Blog 一样从网络上加载类,这样更方便于 RMI 客户端的部署,如 RMI客户端是一个 Applet可以拿单独一台机器运行rmiregistry (它需要能加载到相应的 stub 类,设置classpath)或用LocateRegistry.createRegistry(port),只作为RMI远程对象的RMI 集中注册的服务器,真正提供服务对象在网上注册,客户端只需从注册服务器上查找远程对象引用,然后调用远程方法,具体由谁提供服务由注册服务器来。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2