JAVA RMI深度结论

JAVA RMI是什么?

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
RMI是java的远端调用机制(RPC)的实现。即RMI是一组JAVA语言实现RPC的API。

通俗解释

在这个JVM中通过RMI可以调用其他JVM中对象的方法。不管是这台计算机上JVM还是其他其他计算机上的JVM。
RMI的底层是使用了TCP/IP协议进行通信的。基于JAVA中的BIO实现的。

客户端调用过程中的底层原理细节:

  1. 客户端通过socket发送rmi请求"rmi://127.0.0.1:1099/action"
  2. 客户端拿到返回的一串二进制码,这个是服务端对象的序列化。
  3. 客户端将二进制码反序列为对象。
  4. 客户端本地调用对象的方法。
  5. 客户端RMI底层进行通信将改变的对象更新到服务端。

服务端RMI使用方式:

  1. 设计远程调用的接口(如IRmiAction),该接口必须在服务端和客户端都要有。
  2. 定义可实例化的对象的类(如RmiActionImpl),可以直接继承UnicastRemoteObject(实现了对象序列化)
  3. 实现远程方法接口。
  4. 注册RMI端口(必需)
    LocateRegistry.createRegistry(1099);
  5. 等待接收rmi请求
    Naming.rebind("rmi://127.0.0.1:1099/hello", action);

客户端RMIAPI使用方法:

  1. 发送请求,获得对象
    IRmiAction action=(IRmiAction) Naming.lookup("rmi://127.0.0.1:1099/hello");
  2. 调用方法
    action.add();

demo 代码

RMI远程调用方法接口

 public interface IRmiAction extends Remote{
    
    public int add() throws RemoteException;

}

对象实例以及服务端

public class RmiActionImpl extends UnicastRemoteObject implements IRmiAction{
    private static final long serialVersionUID = -2241003422571775103L;
    private int total=0;
    protected RmiActionImpl() throws RemoteException {
        super();
        // TODO Auto-generated constructor stub
    }

    @Override
    public int add() throws RemoteException {
        // TODO Auto-generated method stub
        total++;
        return total;
    }
    
    public int getTotal(){
        return total;
    }
    
    public static void main(String[] args) {
        try {
            
            LocateRegistry.createRegistry(1099);
            IRmiAction action=new RmiActionImpl();
            
            Naming.rebind("rmi://127.0.0.1:1099/hello", action);
            
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

客户端调用

public class RmiActionClient {
    public static void main(String[] args) {
        try {
            IRmiAction action=(IRmiAction) Naming.lookup("rmi://127.0.0.1:1099/hello");
            System.out.println(action.add());
            
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NotBoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,955评论 18 399
  • Java 面试题 整理自牛客网 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟...
    GuaKin_Huang阅读 13,612评论 19 265
  • Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点: 代码开发模块化,更易...
    安安静静写代码阅读 4,719评论 0 8
  • 最近看了很多篇谈孤独的文章。 现代人似乎越来越孤独。总是能看到听到倾诉孤独的声音。 有人说,狂欢是一群...
    千山行歌阅读 2,967评论 0 1
  • 高考结束,各种忙碌、各种选择,并没有感受到分离的气息,儿子那种不紧不慢的性格让我这当娘的万分捉鸡,高考刚结束的孩子...
    笨笨的六毛阅读 1,410评论 0 0