经过两天的调试一个非常简单的rmi demo终于可以在一台机器上调用成功了。下面仔细回顾一下。 RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序 一个正常工作的RMI系统由下面几个部分组成: # 远程服务的接口定义 # 远程服务接口的具体实现 # Stub 和 Skeleton 文件 # 一个运行远程服务的服务器 # 一个RMI命名服务,它允许客户端去发现这个远程服务 # 类文件的提供者(一个HTTP或者FTP服务器) # 一个需要这个远程服务的客户端程序 下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。 如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统: 1、 编写并且编译接口的Java代码 2、 编写并且编译接口实现的Java代码 3、 从接口实现类中生成 Stub 和 Skeleton 类文件 4、 编写远程服务的主运行程序 5、 编写RMI的客户端程序 6、 安装并且运行RMI系统 1.编写并且编译接口的Java代码 package test; import java.rmi.Remote; import java.rmi.RemoteException; public interface PerfectTimeI extends Remote{ long getPerfectTime() throws RemoteException; } 注释: 在这个接口里面要继承Remote接口,每个方法都要抛出RemoteException; 2.编写并且编译接口实现的Java代码 //PerfectTime.java //The implementation of the PerfectTime remote object package test; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI { private static final long serialVersionUID = 1L; public PerfectTime() throws RemoteException { } public long getPerfectTime() throws RemoteException { return System.currentTimeMillis(); } } 注释: 这个类是接口的实现类。 需要实现PerfectTimeI接口并且要继承 UnicastRemoteObject。 需要写一个无参数的构造函数,使他抛出RemoteException。 3.从接口实现类中生成 Stub 和 Skeleton 类文件 javac test\PerfectTimeI.java javac test\PerfectTime.java rmic test.PerfectTime 4.编写远程服务的主运行程序 package test; import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class PerfectServer { public static void main(String[] args) { PerfectTimeI pt; try { pt = new PerfectTime(); Registry memberRegistry=LocateRegistry.createRegistry(10088); System.out.println(pt.getPerfectTime()); memberRegistry.bind("PerfectTime", pt); System.out.print("ok"); } catch (RemoteException e) { e.printStackTrace(); } catch (AlreadyBoundException e) { e.printStackTrace(); } } } 注释: 这里主要是设定绑定 首先应该Registry memberRegistry=LocateRegistry.createRegistry(10088);设定程序监听端口; 再进行绑定memberRegistry.bind("PerfectTime", pt); 5.编写RMI的客户端程序 package test; import java.rmi.Naming; public class DisplayPerfectTime { /** * DisplayPerfectTime 构造子注解。 */ public DisplayPerfectTime() { super(); } public static void main(String[] args) { try { PerfectTimeI t = (PerfectTimeI) Naming.lookup("rmi://192.168.1.100:10088/PerfectTime"); for (int i = 0; i < 10; i++) { System.out.println("PerfectTime:" + t.getPerfectTime()); } } catch (Exception e) { e.printStackTrace(); } } } 注释: 1.Naming.lookup("rmi://192.168.1.100:10088/PerfectTime");返回的是一个PerfectTime_stub他的类型是PerfectTimeI 2.这个lookup的url是rmi://192.168.1.100:10088/PerfectTime rmi://ip address:port/binding_name 6、 安装并且运行RMI系统 java test.PerfectServer //运行服务器端 //编译客户端并运行ta javac test\DisplayPerfectTime.java java test.DisplayPerfectTime
相关资源:第一个rmi简单的程序