头几天有一个小学妹找我帮她写实验报告,内容一大堆,主要是利用RMI实现通讯,RMI我之前一直没有用过,此次也算学习了,就把心得写出来,网上主要都是如何用RMI写代码,可是在eclipse下开发RMI和详细解释不是不少,我就把我主要理解的一些东西写出来把。java
先展现一下本人用命令行运行的代码流程和解释,我也是参考人家的。tomcat
- Hello.java
- /* * @author javamxj (CSDN Blog) 建立日期 2004-12-27 */
- import java.rmi.*; // RMI本地接口必须从Remote接口派生
- public interface Hello extends Remote { // 接口中的具体方法声明,注意必须声明抛出RemoteException
- String sayHello(String name) throws RemoteException; }
2.远程对象实现类安全
这个类应实现RMI客户机调用的远程服务对象的本地接口,它必须从UnicastRemoteObject继承,构造函数应抛出RemoteException异常。 服务器
- HelloImpl.java
- /*
- * @author javamxj (CSDN Blog) 建立日期 2004-12-27
- */
- import java.rmi.*;
- import javax.rmi.PortableRemoteObject;
- public class HelloImpl extends PortableRemoteObject implements Hello {
- /* 构造函数 */
- public HelloImpl() throws RemoteException {
- super();
- }
- /* 实现本地接口中声明的'sayHello()'方法 */
- public String sayHello(String message) throws RemoteException {
- System.out.println("我在RMI的服务器端,客户端正在调用'sayHello'方法。 ");
- System.out.println("Hello " + message);
- return message;
- }
- }
3.RMI服务器类
该类建立远程对象实现类HelloImpl的一个实例,而后经过一个专有的URL来注册它。所谓注册就是经过Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,将HelloImpl实例绑定到指定的URL上。框架
- HelloServer.java
- /*
- * @author javamxj (CSDN Blog) 建立日期 2004-12-27
- */
- import java.rmi.*;
- public class HelloServer {
- public static void main(String[] args) {
- // 在服务器端设置安全机制
- /*
- if (System.getSecurityManager() == null) {
- System.setSecurityManager(new RMISecurityManager());
- }
- */
- try {
- System.out.println("开始 RMI Server ...");
- /* 建立远程对象的实现实例 */
- HelloImpl hImpl = new HelloImpl();
- System.out.println("将实例注册到专有的URL ");
- Naming.rebind("HelloService", hImpl);
- System.out.println("等待RMI客户端调用...");
- System.out.println("");
- } catch (Exception e) {
- System.out.println("错误: " + e);
- }
- }
- }
请注意有关 rebind 方法调用的下列参数:eclipse
- HelloClient.java
- /*
- * @author javamxj (CSDN Blog) 建立日期 2004-12-27
- */
- import java.rmi.*;
- public class HelloClient {
- public static void main(String[] args) {
- // 在服务器端设置安全机制
- /*
- if (System.getSecurityManager() == null) {
- System.setSecurityManager(new RMISecurityManager());
- }
- */
- /* 默认为本地主机和默认端口 */
- String host = "localhost:1099";
- /* 带输入参数时,将host设置为指定主机 */
- if (args.length > 0)
- host = args[0];
- try {
- /* 根据指定的URL定位远程实现对象 */
- /* “h”是一个标识符,咱们将用它指向实现“Hello”接口的远程对象 */
- Hello h = (Hello) Naming.lookup("rmi://" + host + "/HelloService");
- System.out.println("实现“Hello”接口的远程对象: " + h);
- System.out.println("我在客户端,开始调用RMI服务器端的'sayHello'方法");
- System.out.println("欢迎, " + h.sayHello("javamxj blog"));
- } catch (Exception ex) {
- System.out.println("错误 " + ex);
- }
- }
- }
2、设置开发环境 socket
在安装好插件包后,咱们来设置RMI开发环境。启动Eclipse,在菜单window->preferences对话框中,选中左边树菜单java->rmi,右边窗口会出现RMI Plugin的默认设置信息。 最上面的Path to RMI registry设置java的RMI Registry的路径,如这里设置的是C:/Program Files/Java/jdk1.5.0_05/bin/rmiregistry.exe,通常不用管它。下面的一个框是RMI的服务端口,默认是 1099,这个相似tomcat的服务端口8080同样,连接的时候须要找到对应的端口才能连接上。其实RMI的最低层是socket。 这里须要特别指出的是RMI Plugin是个收费的Eclipse插件,有15天的免费试用期。而RMI属性中最大的窗口就是填使用受权信息的。分布式
这也就是开发环境的基本设置,主要是须要RMI的插件和设置。ide
3、运行调试项目函数
在运行以前须要进行一下设置,不然,会提示错误信息,说找不到stub类。
1、启动RMIRegistry
Eclipse菜单window->show view->others,在弹出菜单中选择RMI Views>RMI Registry Inspector,这是会多出来一个窗口,这里能够显示已经注册的RMI应用。点击工具条上的RMI Plugin图标,在菜单中选择Start Local Registry。注意这个只须要启动一次,除非你把它关掉。
2、配置运行RMI服务 右键点击左边树中的RMI_Server.java文件,菜单Debug As ->RMI Application。在弹出对话框中找到RMI Properties标签页。 这时这里前两项显示红色。 选中java.security.police项的value框,点击选择按钮会出现文件选择对话框,咱们这里设置成C:/Program Files/Java/jre1.5.0_05/lib/security/java.security。就是jre的安全策略配置文件,要选择成泥当前用的jdk的侧略文件。选中第二项java.rmi.server.codebase的value项,这里选择编译后类包所在的文件夹。点击选择按钮->add按钮->pick from workspace,选择当前工程RMITest的bin文件夹。这里是file:/E:/workspace/RMITest/bin/。(这里有点要补充一下,还能够 点击选择按钮->add按钮->compute from classpath)。
以上是运行RMI Application,可是个人电脑没显示RMI Application,当时这个窗口也显示不到任何RMI项目
这时没法启动RMIRegistry ,所以只能手动启动RMIRegistry
这里启动完成RMI注册,而且会在工程的bin路径下生成先关的stub类。在运行服务器类和客户端类就完成了。注意这个RMI注册只只能启动一次,除非你把它关掉。