一、定义
RMI远程方法调用(Remote Method Invocation),它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
JRMP(java remote method protocol):java远程方法协议,这是完成java到java远程调用的协议,基于TCP协议。
二、RMI交互图
方法调用从客户对象经存根(stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。
存根扮演着远程服务器对象的代理的角色,使该对象可被客户激活。
远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。
传输层管理实际的连接,并且追踪可以接受方法调用的远程对象。
骨干网完成对服务器对象实际的方法调用,并获取返回值。
返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,存根获得返回值。
三、示例
1.服务端创建服务接口继承Remote


import java.rmi.Remote; import java.rmi.RemoteException; /** * @Title: IRemote.java * @Package * @Description: TODO(用一句话描述该文件做什么) * @author: liandy * @date: 2019年7月13日 下午3:28:52 * @version V1.0 */ /** * @ClassName: IRemote * @Description:TODO(这里用一句话描述这个类的作用) * @author: liandy * @date: 2019年7月13日 下午3:28:52 * */ public interface IService extends Remote{ String show()throws RemoteException;//声明方法 }
2.服务端创建服务实现类并继承UnicastRemoteObject


import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * @Title: ServiceImpl.java * @Package * @Description: TODO(用一句话描述该文件做什么) * @author: liandy * @date: 2019年7月13日 下午3:30:17 * @version V1.0 */ /** * @ClassName: ServiceImpl * @Description:TODO(这里用一句话描述这个类的作用) * @author: liandy * @date: 2019年7月13日 下午3:30:17 * */ public class ServiceImpl extends UnicastRemoteObject implements IService{ /** * @Title: ServiceImpl * @Description: TODO(这里用一句话描述这个方法的作用) * @param: @throws RemoteException * @throws */ protected ServiceImpl() throws RemoteException { super(); // TODO Auto-generated constructor stub } /** * <p>Title: show</p> * <p>Description: </p> * @return * @throws RemoteException * @see IService#show() */ @Override public String show() throws RemoteException { // TODO Auto-generated method stub return "show"; } }
3.客户端调用


import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; /** * @Title: Client.java * @Package * @Description: TODO(用一句话描述该文件做什么) * @author: liandy * @date: 2019年7月13日 下午3:33:29 * @version V1.0 */ /** * @ClassName: Client * @Description:TODO(这里用一句话描述这个类的作用) * @author: liandy * @date: 2019年7月13日 下午3:33:29 * */ public class Client { /** * @throws NotBoundException * @throws RemoteException * @throws MalformedURLException * @Title: main * @Description: TODO(这里用一句话描述这个方法的作用) * @param: @param args * @return: void * @throws */ public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException { // TODO Auto-generated method stub IService r = (IService) Naming.lookup("rmi://localhost:1234/testrmi");//获取远程1234端口对象注册表中testrmi的stub String a = r.show();//调用引用的方法,实际上调用的是stub,由stub与服务端交互并返回结果 System.out.println(a); } }