您的位置:首页 > 编程语言 > Java开发

Java中RMI的实现

2016-05-28 22:38 495 查看
最近在学习Java中的设计模式,在代理模式中有一种远程代理,它是通过RMI来实现的。

1、作用

RMI是通过网络使得本地对象能够方便地远程对象的方法,使得本地对象调用远程对象的方法跟调用本地对象的方法一样。

2、 调用过程



如上图,客户端中的客户对象调用服务端服务对象的方法A(),其过程是:

(1) 客户对象调用远程对象的方法A();

(2) 客户辅助对象将请求进行包装,通过网络发送到服务端的服务辅助对象;

(3) 服务辅助对象将请求进行解析,调用服务对象的A()方法;

(4) 得到返回值后,服务辅助对象将返回值进行包装,通过网络发送给客户辅助对象;

(5) 客户辅助对象收到后进行解释,最后将结果传给客户对象。

这就是远程方法调用的一个基本过程。客户对象并不知道其结果是通过网络请求服务对象才返回的结果,对于服务对象来时,这跟调用本地方法是一样的。

3、 实例

(1) 设计

MyRemoteImpl类是服务类,MyRemoteClient是客户类,它们都实现了共同的接口MyRemote。

(2) 源码

MyRemote类

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MyRemote extends Remote
{
public String sayHello() throws RemoteException;
}


MyRemoteImpl类

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote
{
protected MyRemoteImpl() throws RemoteException
{
}

private static final long serialVersionUID = 1L;

@Override
public String sayHello()
{
return "Server say, Hey";
}

public static void main(String[] args)
{
try
{
/*
*注意,这里的10.6.11.127是我的服务端地址
*端口8088是随便选的,只要现在没用其他程序使用该端口就行
*/
System.setProperty("java.rmi.server.hostname","10.6.11.127");
MyRemote servcie = new MyRemoteImpl();
LocateRegistry.createRegistry(8088);
Naming.rebind("//10.6.11.127:8088/RemoteHello", servcie);

} catch (Exception e)
{
e.printStackTrace();
}
}
}


MyRemoteClient类

import java.rmi.*;

public class MyRemoteClient
{
public static void main(String[] args)
{
new MyRemoteClient().go();
}

public void go()
{
try
{
MyRemote service = (MyRemote) Naming.lookup("//10.6.11.127:8088/RemoteHello");
String s = service.sayHello();
System.out.println(s);
} catch (Exception e)
{
e.printStackTrace();
}
}
}


(3) 运行方法一——在命令行中运行

在命令框下,切换到你的类所在的目录(注意,代码里最好不要有package信息)。先进行编译MyRemote接口,再编译MyRemoteImpl和MyRemoteClient类。然后运行rmic产生stub,再通过rmiregistry进行注册。



另外启动一个终端,切换到类所在目录,运行服务端程序



再启动一个终端,切换到类所在目录,运行客户端程序



当你看到“Server say, Hey”时,说明已经运行成功。

(4) 运行方法二——在Eclipse中运行

本人习惯在Eclipse中写代码,所以想在Eclipse中直接运行RMI代码,这就需要先安装一个插件,然后进行相关配置。

① 安装插件

Eclipse RMI Plugin,你可以从网上搜,或者从这个链接下载:http://download.csdn.net/detail/liu_005/9534228

② 下载后进行解压,将解压后的两个文件夹的文件拷贝到你的Eclipse目录下的相应文件夹中,并重启Eclipse,如果出现如下图标说明插件安装成功。



③ 配置

在项目中右键,选择run configurations。在如下界面中,对于java.security.policy项选择你的java目录的\Java\jdk1.7.0_79\jre\lib\security目录下的java.security文件,对于java.rmi.server.codebase项选择你当前项目的bin目录,对于java.rmi.server.userCodebaseOnly项选择false(这个我不太确定,如果不行,可以选择true试试)。设置完成后开始运行。



④ 运行服务类请选择RMI Application,运行客户类可以选择java Application或者RMI Application。

4、 总结

以上就是我对于在Java中实现RMI的一个简单实验,希望对初学者理解和搭建RMI有帮助。由于本人水平有限,如有错误之处,敬请大神指正,不胜感激。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息