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

powershell 复制代码
C:\Users\love1>start rmiregistry  2001

C:\Users\love1>

linux

bash 复制代码
[yiifung@master02 ~]$ rmiregistry -J-D=java.rmi.server.codebase=/home/yiifung   2001 &
[1] 4980

java代码实现

java 复制代码
LocateRegistry.createRegistry(2001); //Registry使用2001端口,默认启动端口1099

4、获取 rmiregistry实例对象

java 复制代码
Registry registry = LocateRegistry.getRegistry("127.0.0.1", 20001); //获取Registry

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

java 复制代码
 HelloRemote stub = (HelloRemote) UnicastRemoteObject.exportObject(helloRemote, 1);

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

四、rmic详解

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

powershell 复制代码
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>

生成的静态存根类如下

powershell 复制代码
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>
相关推荐
Highcharts.js14 分钟前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
头发还在的女程序员1 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats2 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123452 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
爱写代码的小朋友4 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华4 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.4 小时前
C++:语句和作用域
开发语言·c++
都叫我大帅哥5 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.5 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
海天鹰6 小时前
PHP上传文件
android·开发语言·php