Java -- 远程程序调用(Remote Method Invocation RMI)
引言
一般Java的方法调用都是对运行在相同Java虚拟机上的对象进行的,也就是调用方法与被调用方法都是在同一个堆上。
如果要调用不同机器上的对象的方法呢?这就要用到RMI技术。
远程过程调用的设计
要创建出4种东西:服务器、客户端、服务器辅助设施、客户端辅助设施
1.创建客户端和服务器应用程序
2.创建服务器和客户端的 辅助设施(helper)。它们会处理所有客户端和服务器的低层网络输入/输出细节,让你的客户端和程序好像在处理本机的调用一样。
辅助设施的任务
辅助设施是个实际上执行通信的对象。让你的客户端和程序好像在处理本机的调用一样。客户端以为它调用的是远程服务,因为辅助设施假装成该服务对象。
但客户度辅助设施不是真正的远程服务,它没有真正客户端需要的方法逻辑。相反,辅助设施会去连接服务器,将调用信息传送过去(比如方法的名称和参数),然后等待服务器响应。
服务器端,服务器辅助设施通过socket连接来自客户端辅助设施的要求,解析打包来的信息,然后调用真正的服务。因此对服务对象来说此调用来自本地。
服务器辅助设施取得返回值后送回去(通过socket输出串流)给客户端辅助设施。客户端辅助设施会解开这些信息传给客户端对象。

Java RMI 提供客户端和服务器端的辅助设施对象
在Java中 RMI已经帮你创建好客户端和服务器端的辅助设施。
RMI中 客户端的辅助设施称为stub,服务器端的辅助设施称为skeleton
RMI 的协议
使用RMI时有2种协议: JRMP或是IIOP
JRMP:RMI的原生协议,它是为了Java对Java间的远程调用而设计的。
IIOP:为了CORBA(Common Object Request Broker Architecture)而产生的,它让你能够调用Java对象或其他类型的远程方法。
CORBA通常比RMI麻烦,因为若两端不全都是Java的话,就会发生一些可怕的转译和交谈操作。
创建远程服务
步骤1:创建远程接口
// 1.继承java.rmi.Remote
// Remote是个标记性接口,没有方法。接口是可以继承其他接口的,使用extends关键字。
// 2.声明所有方法都会抛出java.rmi.RemoteException
// 3.确定所有参数和返回值类型都是基本类型或可序列化的对象
// 任何远程方法的参数都会被打包通过网络传送,而这是通过序列化实现的。返回值也一样。
public interface MyRemote extends Remote {
public String sayHello() throws java.rmi.RemoteException;
}
步骤2:实现远程接口
// 继承java.rmi.server.UnicastRemoteObject
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
// 1.实现MyRemote接口
// 2.提供一个无参构造器,调用父类的无参构造器
public MyRemoteImpl() throws java.rmi.RemoteException {
}
// 3.实现sayHello方法
@Override
public String sayHello() {
return "Server says, 'Hey there!'";
}
public static void main(String[] args) {
try {
// 4.创建MyRemoteImpl对象
MyRemoteImpl remote = new MyRemoteImpl();
// 5.注册远程对象到RMI注册表.RMI系统会把stub加到注册表中
java.rmi.Naming.rebind("Remote Hello", remote);
System.out.println("Server is ready.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
步骤3:产生stub和skeleton
1.对实现出的类执行rmic。 从实现类所在目录执行rmic。
rmic 编译 器 (JDK自带)根据 编译 后的 Java 类 (含有 远 程 对 象 实现 )名,为远程对象生成 stub 和 skeleton( 远 程 对 象是指 实现 java.rmi .Remote 接口的 对 象)。在 rmic 命令中所 给 的 类 必 须 是 经 javac 命令成功 编译 且是完全包限定的 类 。
命令代码:rmic MyRemoteImpl
从 Java 11 开始,rmic 工具已被移除
步骤4:执行rmiregistry
从类这个目录来运行。
命令代码:rmiregistry
RMI registry 必须在同一台机器上与远程服务一块执行,且必须在对象的注册之前启动。
步骤5:启动服务
调用另一个命令行来启动服务
命令代码:java MyRemoteImpl
客户端程序代码
public class MyRemoteClient {
public static void main(String[] args) {
new MyRemoteClient().go();
}
public void go() {
try {
// 1.客户端查找RMI注册表中的远程对象
// Naming.lookup()方法的参数是一个URL字符串,格式为"rmi://host:port/name"。
// 2.RMI注册表返回stub对象
MyRemote service = (MyRemote) Naming.lookup("rmi:127.0.0.1/Remote Hello");
String s = service.sayHello(); // 2.调用远程方法
System.out.println("Server says: " + s); // 3.输出结果
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上是RMI的简单示例,如果深入探索,也许你会加入Jini查询服务等待,具体如何使用需要读者自己去发现了。
Java -- 远程程序调用(Remote Method Invocation RMI)的更多相关文章
- Spring Remoting: Remote Method Invocation (RMI)--转
原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ...
- Java远程方法调用(Remote Method Invocation,RMI)
Java RMI简介: 它是Java的一个核心API和类库,允许一个Java虚拟机上运行的Java程序调用不同虚拟机上运行的对象中的方法,即使这两个虚拟机运行于物理隔离的不同主机上. Java RMI ...
- java的RMI(Remote Method Invocation)
RMI 相关知识RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络 ...
- K:java中的RMI(Remote Method Invocation)
相关介绍: RMI全称是Remote Method Invocation,即远程方法调用.它是一种计算机之间利用远程对象互相调用,从而实现双方通讯的一种通讯机制.使用这种机制,某一台计算机(虚拟机) ...
- Spring之RMI 远程方法调用 (Remote Method Invocation)
RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ...
- [转]Java远程方法调用
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远 ...
- js 四种调用方式 Method Invocation Pattern
4.3. Invocation Invoking a function suspends the execution of the current function, passing control ...
- RMI(Remote Method Invocation ) 概念恢复
1.RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法. 2.EMI术语 在研究 ...
- 【Java Web开发学习】远程方法调用RMI
Java RMI 远程方法调用Remote Method Invocation 转载:http://www.cnblogs.com/yangchongxing/p/9078061.html 1.创建远 ...
- 【杂谈】对RMI(Remote Method Invoke)的认识
前言 对RMI接触的也比较早,基本上刚学完Java基础不久就机缘巧合遇到了.当时有尝试着去了解,但是没看到比较好的教程,而且对网络编程相关知识不太了解,看了不少文章,也没弄明白.现在对网络和I/O有了 ...
随机推荐
- SMU Autumn 2024 Trial 1
A. Load Balancing 很明显题意要的就是让我们把每个数往平均值靠,这样就保证最大值-最小值最小 但是当sum%n !=0的时候就说明无法每个数都等于sum/n,所以处理的方法就是,先计算 ...
- 探秘Transformer系列之(24)--- KV Cache优化
探秘Transformer系列之(24)--- KV Cache优化 目录 探秘Transformer系列之(24)--- KV Cache优化 0x00 前言 0x01 背景知识 1.1 度量指标 ...
- jwt的个人理解
概念: jwt全名json web token,是一种web登录验证和授权技术 官网debug:#debug 应用场景: 授权这是使用JWT最常见的场景.一旦用户登录,每个后续请求将包括JWT,允许用 ...
- 单元测试(一)——xUnit
一.为什么要做单元测试 可以频繁测试 比人工测试要快 测试代码和人工代码紧密结合 测试结果非常可靠 更容易更快发现错误 二.测试坐标图 一般开发会做单元测试和集成测试 三.测试分成三个阶段 四.Xun ...
- Hadoop和Spark大数据挖掘与实战
1.概述 本节将系统讲解大数据分析的完整流程,包括数据采集.预处理.存储管理.分析挖掘与结果可视化等核心环节.与此同时,我们还将对主流数据分析工具进行横向对比,帮助读者根据实际需求选用最合适的工具,提 ...
- VC6.0工具下载安装
公众号回复:'VC6.0'
- 【记录】手机QQ和电脑QQ里的emoji种类有什么差异?
版本 手机 QQ:V 8.9.76.12115 电脑 QQ:QQ9.7.15(29157) 偶然发现,有一种emoji手机上怎么找都找不到,一开始以为自己失忆了,后来发现这种emoji只在电脑上有. ...
- AI 在软件测试中的应用:2025 年趋势、工具及入门指南
引言 人工智能 (AI) 正在深刻地重塑软件开发和质量保证 (QA) 的各个方面.尤其是在软件测试领域,AI 不再仅仅是未来愿景,而是当下正在发生的变革.据世界质量报告(2023-24)指出,高达 7 ...
- python开发Streamable HTTP MCP应用
一.概述 使用python开发,最好的框架是fastmcp,github连接:https://github.com/jlowin/fastmcp 2025 年 5 月 9 日,fastmcp发布v2. ...
- 极简版闹钟(java)
package javaBasic; import java.awt.Toolkit; import java.awt.event.*; import java.text.SimpleDateForm ...