最近在学习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.youkuaiyun.com/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有帮助。由于本人水平有限,如有错误之处,敬请大神指正,不胜感激。