### RMI 使用实例详解 #### 一、RMI 概述 远程方法调用(Remote Method Invocation,简称 RMI)是 Java 平台提供的一种分布式计算技术,它允许开发者创建可跨网络调用的方法,就像在本地调用一样简单。RMI 的设计目标是为了简化企业级应用中的远程对象交互过程,它可以作为 Enterprise JavaBeans (EJB) 的一种替代方案。 #### 二、RMI 工作原理 RMI 的核心思想在于通过远程代理(Stub)和远程框架(Skeleton)来实现远程方法调用。当客户端想要调用远程服务时,它实际上是在调用本地的一个代理对象,这个代理对象负责将调用请求转换为网络消息并发送给远程服务器。远程服务器接收到消息后,通过远程框架将调用请求转换为实际的方法调用,并返回结果给客户端。 #### 三、RMI 实现步骤 ##### 步骤 1:定义接口 需要定义一个接口,该接口继承自 `java.rmi.Remote` 接口,并声明所有远程调用的方法。这些方法都需要抛出 `java.rmi.RemoteException` 异常。 ```java import java.rmi.Remote; import java.rmi.RemoteException; public interface Calculator extends Remote { public long add(long a, long b) throws RemoteException; public long sub(long a, long b) throws RemoteException; public long mul(long a, long b) throws RemoteException; public long div(long a, long b) throws RemoteException; } ``` ##### 步骤 2:实现接口 接下来,需要实现上述接口,创建远程对象的实现类。这里我们使用 `java.rmi.server.UnicastRemoteObject` 类作为基类,以便支持 RMI 功能。 ```java import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class CalculatorImpl extends UnicastRemoteObject implements Calculator { protected CalculatorImpl() throws RemoteException { super(); } @Override public long add(long a, long b) throws RemoteException { return a + b; } @Override public long sub(long a, long b) throws RemoteException { return a - b; } @Override public long mul(long a, long b) throws RemoteException { return a * b; } @Override public long div(long a, long b) throws RemoteException { return a / b; } } ``` ##### 步骤 3:编译及生成 Stubs 和 Skeletons 完成接口和实现类的编写后,需要编译源代码,并使用 `rmic` 工具生成 Stubs 和 Skeletons 文件。这些文件分别用于客户端和服务端,以便进行远程通信。 ```bash javac Calculator.java javac CalculatorImpl.java rmic CalculatorImpl ``` 这会生成 `Calculator_stub.class` 和 `Calculator_Skel.class` 文件。 ##### 步骤 4:部署远程服务 接下来,需要启动 RMI 服务器,并将远程对象绑定到 RMI 注册表中。这个过程通常在服务器端执行。 ```java import java.rmi.Naming; import java.rmi.RemoteException; public class CalculatorServer { public CalculatorServer() throws RemoteException { Calculator calculator = new CalculatorImpl(); try { Naming.rebind("rmi://localhost:1099/CalculatorService", calculator); } catch (Exception e) { System.out.println("Trouble: " + e); } } public static void main(String[] args) { new CalculatorServer(); } } ``` ##### 步骤 5:编写客户端程序 客户端程序负责调用远程服务。需要从 RMI 注册表中查找远程对象,然后通过远程代理进行调用。 ```java import java.rmi.Naming; import java.rmi.RemoteException; public class CalculatorClient { public static void main(String[] args) { try { Calculator calculator = (Calculator) Naming.lookup("rmi://localhost:1099/CalculatorService"); long result = calculator.add(10, 20); System.out.println("Result: " + result); } catch (Exception e) { System.out.println("Error: " + e); } } } ``` #### 四、RMI 实例总结 通过上述步骤,我们成功地实现了基于 RMI 的简单计算器服务。该服务能够跨越网络,在不同的计算机之间进行计算操作。需要注意的是,RMI 的部署和使用涉及到多个环节,包括接口定义、实现、编译、Stubs 和 Skeletons 的生成、远程服务的部署以及客户端的调用等。掌握这些步骤对于理解和使用 RMI 至关重要。 RMI 作为一种成熟的远程调用技术,不仅适用于简单的示例场景,还能满足更为复杂的企业级应用需求。随着对 RMI 深入学习和实践,开发者可以更好地利用其特性构建高效可靠的分布式系统。





























作者:BitsCN整理 来源:中国网管联盟 点击:242 日期:2005-12-31
RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。
RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序
一个正常工作的RMI系统由下面几个部分组成:
远程服务的接口定义
远程服务接口的具体实现
Stub 和 Skeleton 文件
一个运行远程服务的服务器
一个RMI命名服务,它允许客户端去发现这个远程服务
类文件的提供者(一个HTTP或者FTP服务器)
一个需要这个远程服务的客户端程序
下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。
如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统:
1、 编写并且编译接口的Java代码
2、 编写并且编译接口实现的Java代码
bbs.bitsCN.com国内最早的网管论坛
3、 从接口实现类中生成 Stub 和 Skeleton 类文件
4、 编写远程服务的主运行程序
5、 编写RMI的客户端程序
6、 安装并且运行RMI系统
1、接口
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:
//Calculator.java
//define the interface
import java.rmi.Remote;
public interface Calculator extends Remote
{
public long add(long a, long b)
throws java.rmi.RemoteException;
public long sub(long a, long b)
throws java.rmi.RemoteException;
public long mul(long a, long b)
throws java.rmi.RemoteException;
public long div(long a, long b)
throws java.rmi.RemoteException;
}
bitsCN_net中国网管博客
剩余7页未读,继续阅读


- 粉丝: 92
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 计算机视觉课程作业 2:CIFAR10 与 CIFAR100 数据集训练实践
- JavaScript核心编程与最佳实践
- Mathematica 在计算机视觉作业中表现超强碾压对手
- 计算机视觉作业2-训练cifar10和cifar100
- 这篇文章详细介绍了基于小波分析和时域介电谱的变压器油纸绝缘老化状态评估方法及其工程应用(论文复现含详细代码及解释)
- 【无人机通信】基于无人机通信的移动边缘计算任务迁移与资源分配算法研究:优化能耗与计算效率的系统设计(论文复现含详细代码及解释)
- 模式识别与计算机视觉课程第三次作业任务安排
- 这篇文章深入探讨了基于吸引力模型的轴-辐式集装箱海运网络优化问题,尤其关注在竞争环境下中小型海运公司的网络设计与优化策略(论文复现含详细代码及解释)
- 航空电子基于小波包变换及TRLMS抑制脉冲干扰的方法:GNSS接收机中脉冲干扰的有效抑制与信号恢复系统设计(论文复现含详细代码及解释)
- 【电力系统谐波检测】基于小波变换与分形理论的谐波检测方法研究:从理论到工程实践的全面解析(论文复现含详细代码及解释)
- 《模式识别与计算机视觉课程对应的第三次作业》
- 埃博拉酱所开发的计算机视觉工具箱
- 【电力设备检测】基于小波分析和时域介电谱的变压器油纸绝缘老化状态评估:特征提取与智能诊断系统设计(论文复现含详细代码及解释)
- 【雷达目标跟踪】基于新息自适应的扩展卡尔曼滤波算法优化:复杂环境下时变噪声鲁棒性提升系统设计(论文复现含详细代码及解释)
- 【电气化铁路供电系统】基于新型YNvd平衡变压器的同相供电系统设计与仿真:解决无功负序谐波及过分相问题(论文复现含详细代码及解释)
- ### 标题:【无人机系统控制】基于新型观测器的线性UAVs预设时间编队容错控制:分布式控制与故障处理(论文复现含详细代码及解释)


