• JAVA---RMI详解1


    一、RMI简介
    The Java Remote Method Invocation (RMI)允许运行在一台虚拟机上的对象调用运行在另一台虚拟机上的对象中的方法。RMI使用stubs and skeletons (存根和骨架)架构来和远程对象(Remote Object)沟通
    二、相关术语介绍
    1、RMIRegistry
    RMI注册表,RMIServer负责将stubs(存根)注册到RMIRegistry,RMIClient从RMIRegistry获取stubs(存根)。
    2、RMIServer
    RMIServer负责创建Remote Object(远程对象),并将之导出到 JAVA RMI runtime,远程对象必须被导出到JAVA RMI runtime,这样该远程对象才能接受远程调用
    3、RMIClient
    RMIClient负责发起远程方法调用。
    4、Remote Object
    RMIServer负责创建Remote Object(远程对象),并将之导出到 JAVA RMI runtime。
    5、stubs(存根)
    JAVA RMI使用一种特殊的类(这些类被称作stubs)来发起对远程对象的方法调用。远程对象导出的结果形成了这种特殊的类(stubs)。stubs与Remote Object实现的接口是一样的,并且包含hostname和port,hostname和port与Remote Object能够形成对应关系。stubs实例实际上就是Remote Object(远程对象)的引用
    6、skeletons

    三、RMI架构
    RMI远程调用架构图如下:
    在这里插入图片描述
    1、首先创建远程对象接口,该接口必须继承java.rmi.Remote接口,该接口中的方法必须抛出java.rmi.RemoteException异常;
    2、远程对象(Remote Object)必须实现该接口,以及其中所包含的方法
    3、必须启动rmiregistry,有两种启动方式:
    使用rmiregistry工具
    windows

    C:\Users\love1>start rmiregistry  2001
    
    C:\Users\love1>
    
    
    • 1
    • 2
    • 3
    • 4

    linux

    [yiifung@master02 ~]$ rmiregistry -J-D=java.rmi.server.codebase=/home/yiifung   2001 &
    [1] 4980
    
    
    • 1
    • 2
    • 3

    java代码实现

    LocateRegistry.createRegistry(2001); //Registry使用2001端口,默认启动端口1099
    
    • 1

    4、获取 rmiregistry实例对象

    Registry registry = LocateRegistry.getRegistry("127.0.0.1", 20001); //获取Registry
    
    • 1

    5、将远程对象实例导出,并返会该远程对象的stubs实例(the remote object’s stub instance)

     HelloRemote stub = (HelloRemote) UnicastRemoteObject.exportObject(helloRemote, 1);
    
    • 1

    6、客户端会请求一个到该 Remote Object (远程对象)的引用,其实远程对象的stubs实例就是对该远程对象的引用

    四、rmic详解
    rmic用于生成静态存根,但是该方法已被弃用,java现在使用动态生成的存根来取代

    rmic  rmit.HelloRemoteImpl
    PS C:\Users\love1\Documents\technology\java\project> rmic  rmit.HelloRemoteImpl
    警告: 为 JRMP 生成和使用骨架及静态存根
    已过时。骨架不再必要, 而静态存根
    已由动态生成的存根取代。建议用户
    不再使用rmic来生成骨架和静态存根。
    请参阅 java.rmi.server.UnicastRemoteObject 的文档。
    PS C:\Users\love1\Documents\technology\java\project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    生成的静态存根类如下

    PS C:\Users\love1\Documents\technology\java\project> tree rmit  /F
    卷 Windows 的文件夹 PATH 列表
    卷序列号为 E451-5551
    C:\USERS\LOVE1\DOCUMENTS\TECHNOLOGY\JAVA\PROJECT\RMIT
        HelloRemote.class
        HelloRemote.java
        HelloRemoteImpl.class
        HelloRemoteImpl.java
        HelloRemoteImpl_Stub.class
    
    没有子文件夹
    
    PS C:\Users\love1\Documents\technology\java\project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    每天学习一个Linux命令之ssh
    【leetcode热题Hot100】——LRU缓存
    正能量早安祝福问候语,早安说说心情短语好句子
    聊聊对RPC的理解
    Java 双门双向门禁控制板实时监控源码
    性能测试分析与使用
    Linux 进程概念 —— 初识操作系统(OS)
    mysql数据库基础:数据类型介绍
    【零基础算法】链表算法
    计算机网络 | 06.[HTTP篇] HTTP/1.1如何优化
  • 原文地址:https://blog.csdn.net/qq_41768644/article/details/133914003