RMI远端方法调用

匿名 (未验证) 提交于 2019-12-02 23:48:02

一、定义

  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;//声明方法 }
IService

  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";     }  }
ServiceImpl

  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);     }  }
Client

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!