RMI软件下载:http://www.genady.net/rmi/v20/demos/
注意下载对应eclipse版本的RMI插件:http://www.genady.net/rmi/v20/downloads.html
因为如果插件版本与eclipse不一样可能会报以下错误:
Unable to use launch shortcut Reason: Plug-in net.genady.rmi was unable to load class net.genady.rmi.launching.ui.RMIServerLaunchShortcut. org/eclipse/jdt/debug/ui/launchConfigurations/JavaApplicationLaunchShortcut
Demo查看:http://www.genady.net/rmi/v20/demos/
对着这个demo一步步操作就会得到三个项目。注意demo中的操作。
先看一下RMI基本原理:
结合实例看一下RMI开发的主要步骤:
一个正常工作的RMI系统由下面几个部分组成: • 远程服务的接口定义 • 远程服务接口的具体实现 • Stub 和 Skeleton 文件 • 一个运行远程服务的服务器 • 一个RMI命名服务,它允许客户端去发现这个远程服务 • 类文件的提供者(一个HTTP或者FTP服务器) • 一个需要这个远程服务的客户端程序
1、编写并且编译接口的Java代码 2、编写并且编译接口实现的Java代码 3、从接口实现类中生成 Stub 和 Skeleton 类文件 4、编写远程服务的主运行程序 5、编写RMI的客户端程序 6、安装并且运行RMI系统
类图如下:
具体构建步骤可以看:http://www.genady.net/rmi/v20/demos/分别创建接口文件,接口的实现文件;以及服务端文件,客户端代码;
再运行注册服务器,最后运行服务端代码,再运行客户端代码看是否成功调用服务端方法。
附件中有rmi相关文章及示例代码。
下面太概列一下自己的步骤方便查看:
首先安装eclipse的rmi插件,下载对应eclipse版本的rmi插件。:
建立公共项目,里面就只有一个接口文件,因为服务端和客户端都要用到,所以建立这个公共项目了。
项目名:print-common
文件:RemotePrinter .java
package demo.rmi.print.common; import java.rmi.Remote; import java.rmi.RemoteException; public interface RemotePrinter extends Remote { public String add(String str1, String str2) throws RemoteException; }
下面建立服务端项目:
项目名:print-server
接口实现类:RemotePrinterImpl.java
package demo.rmi.print.server; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import demo.rmi.print.common.RemotePrinter; public class RemotePrinterImpl extends UnicastRemoteObject implements RemotePrinter { public RemotePrinterImpl() throws RemoteException{ } @Override public String add(String str1, String str2) throws RemoteException { System.out.print("add method has een called"); return str1 + str2; } }
注意接口实现类继承了UnicastRemoteObject 类,需要定义构造方法并抛出异常。
在服务端新建类PrintServer.java用于启动服务,绑定方法。
package demo.rmi.print.server; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class PrintServer { /** * @param args */ public static void main(String[] args) { try{ Registry r = LocateRegistry.getRegistry(); r.bind("printer", new RemotePrinterImpl()); System.out.println("printer server is ready"); }catch(Exception e){ e.printStackTrace(); } } }
完了之后重要的一步:右键点击项目print-server找到RMI里面点Enable Stubs Gerneration,这样在编译后的文件夹目录会多出一个RemotePrinterImpl_Stub.class;
右键点击项目print-server找到Properties,点RMI Compiler Properties.勾选-keep选项,在源代码目录产生RemotePrinterImpl_Stub.java类。此类使用代理模式运用反射机制生成。
下面新建项目print-client
客户端类:PrintClient.java
package demo.rmi.print.client; import java.rmi.Naming; import java.rmi.RMISecurityManager; import demo.rmi.print.common.RemotePrinter; public class PrintClient { /** * @param args */ public static void main(String[] args) { try{ System.setSecurityManager(new RMISecurityManager()); RemotePrinter printer = (RemotePrinter)Naming.lookup("rmi://localhost/printer"); String str = printer.add("good", "str2"); System.out.println(str); }catch(Exception e){ e.printStackTrace(); } } }
注意使用了System.setSecurityManager(new RMISecurityManager());
好了。代码就这么多。如何运行?
1、先运行eclipse工具栏的rmi的start local registry
2、运行PrintServer.java,对该文件点右键Run as RMI Application,可以打开dialog,找到RMI VM Properties
在java.rmi.server.codebase,选择后点compute from classpath,得到相应内容后确定,run
3、运行客户端,PrintClient.java,对该文件点右键Run as RMI Application,可以打开dialog,找到RMI VM Properties在java.security.policy后面选择点create,确认后会在print-client项目下生成 security.policy文件点OK,RUN后打印出goodstr2,结果表明调用了服务器端的方法。远程调用成功。
上面写的是用RMI插件编码产生stub和Skel类文件,用过一段时间之后发现插件过期了,不行那怎么办呢?能不能手动编译呢?参考以下链接:
如何使用RMI:http://download.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html
如何编译生成文件:http://download.oracle.com/javase/1.5.0/docs/tooldocs/windows/rmic.html
编译方法:cmd控制台进入src目录,使用命令:rmic -g -keep -vcompat com.customs.GateServer
编译后产生了GateServer_Skel.class,GateServer_Skel.java,GateServer_Stub.class,GateServer_Stub.java文件。