
深入理解Java RMI的使用和机制

Java远程方法调用(Java RMI)是一种用于实现Java程序间远程通信的技术,它是Java EE的一部分。Java RMI允许一个Java虚拟机上的对象调用另一个Java虚拟机上的对象的方法。这种调用的机制就像是本地方法调用一样,但是实际上是通过网络实现的,因此RMI特别适合在分布式对象系统中使用。
### RMI机制与用法
#### 基本概念
- **远程对象(Remote Object)**:具备网络通信能力的对象。可以是实现了远程接口的类的实例。
- **远程接口(Remote Interface)**:继承自`java.rmi.Remote`接口的接口。该接口中的每个方法都必须声明抛出`java.rmi.RemoteException`异常。
- **stub和skeleton**:stub相当于远程对象的代理,客户端通过调用stub的方法,stub将调用请求通过网络传递给服务器上的skeleton,skeleton再调用实际的远程对象方法。
#### RMI的工作流程
1. **创建远程接口**:定义一个继承自`java.rmi.Remote`的接口,并在接口中声明需要远程调用的方法。
2. **实现远程接口**:创建一个类,实现远程接口,并在此类中实现接口定义的方法。
3. **导出远程对象**:调用`UnicastRemoteObject.exportObject()`方法将实现的远程对象实例导出,使其可以被远程访问。
4. **注册对象**:将导出的远程对象注册到RMI注册表(RMI Registry),通常使用`Naming.bind()`方法。
5. **查找对象**:在客户端使用`Naming.lookup()`方法从RMI注册表获取远程对象的stub,并将其转换为正确的类型。
6. **客户端调用**:客户端通过获取的stub调用远程对象的方法,就像调用本地方法一样。
#### 安全性
- **RMI安全性框架**:RMI提供了自定义的认证和授权机制。可以在stub和skeleton之间加入认证机制,通过实现`RMISecurityManager`来自定义安全策略。
- **代码签名**:为了防止恶意代码的执行,可以对RMI中使用的代码进行数字签名。
- **防火墙与网络安全**:确保网络和防火墙设置允许RMI通信,通常需要开放特定的端口。
#### 异常处理
- **RemoteException**:在远程接口中声明的所有方法都必须处理`RemoteException`,这是网络通信可能出现的异常。
- **NotBoundException**:当尝试绑定或者查找一个未注册的对象时,会抛出`NotBoundException`。
- **ConnectException**:当RMI无法与远程对象建立连接时,会抛出`ConnectException`。
### RMI的例子
文档中应当包含一个或多个使用Java RMI的实际代码示例,这些示例详细演示了RMI的用法,可能包含以下步骤:
1. **创建远程接口示例**:
```java
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
```
2. **实现远程接口示例**:
```java
public class HelloImpl extends UnicastRemoteObject implements Hello {
protected HelloImpl() throws RemoteException {
super();
}
public String sayHello() {
return "Hello, world!";
}
}
```
3. **导出远程对象示例**:
```java
// 无须手动导出,因为HelloImpl继承自UnicastRemoteObject会自动导出
```
4. **注册对象到RMI注册表示例**:
```java
try {
LocateRegistry.createRegistry(1099); // 创建RMI注册表
Naming.bind("rmi://localhost/Hello", new HelloImpl()); // 绑定远程对象到注册表
} catch (Exception e) {
e.printStackTrace();
}
```
5. **客户端调用远程对象方法示例**:
```java
try {
Hello stub = (Hello) Naming.lookup("rmi://localhost/Hello"); // 从注册表查找远程对象
System.out.println("Client received: " + stub.sayHello()); // 调用远程对象方法
} catch (Exception e) {
e.printStackTrace();
}
```
### RMI的高级特性
- **RMI over IIOP**:RMI-IIOP允许RMI客户和服务器通过IIOP协议进行通信,IIOP是CORBA的通信协议。这为RMI提供了更多的互操作性。
- **RMI防火墙穿透**:RMI穿透需要配置RMI代理以允许在防火墙内外的对象进行通信。
- **激活对象(Activation)**:RMI提供了一种机制,允许对象被存储在“激活”系统上,这样对象能够在需要时自动被激活和调用。
- **分布式垃圾收集**:RMI使用引用计数和租约机制来管理远程对象的生命周期,以实现分布式垃圾收集。
Java RMI是一个功能强大的分布式对象系统,它将对象间的通信抽象化,使得开发者能够更容易地在分布式系统中进行开发。然而,由于网络通信的不稳定性,Java RMI也面临着性能和安全性的挑战。因此,在使用Java RMI时,开发者需要特别注意网络异常处理和安全性配置。
相关推荐









tongyicun
- 粉丝: 0
最新资源
- 全国数学建模大赛获奖论文解析与技巧
- 新一代多语言网店系统免费下载支持多支付平台
- VB程序实现邮件附件发送技巧
- ZK-Gmaps源码包2.0_10版下载
- C#中级实例:Winform源码解析与桌面小精灵教程
- 使用JSP和Java实现模拟Google搜索功能
- ACM竞赛资料大合集:历年试题及解析
- 多格式多模式屏幕截图工具介绍
- Skin++ForVB6实现Vista风格界面特效
- 图标处理程序源代码实现及应用
- Vs2005环境下动态生成并自定义菜单的方法
- 使用jxl包实现xls到html的自动转换方法
- PB语言开发的IE浏览器源码解析与介绍
- XMLSpy 2005:企业级XML开发环境全攻略
- 轻松部署对联广告JavaScript源码
- 全面覆盖大学物理知识点的习题集及答案解析
- Eclipse SWT/JFace核心源代码分享指南
- 全自动甘特图软件安装与使用指南
- 阿扎达1与2详细图文攻略全面解析
- 基于Struts2+Hibernate+Spring实现高效分页
- PL/SQL DEVELOPER 7.15版注册文件使用指南
- 如何使用ADO派生实现简单的DBGrid控件
- 离散数学课件精选:集合论与图论基础
- HTML基础教程:简明易懂的入门指南