1、概述
RMI 是 Java 提供的一个完善的简单易用的远程方法调用框架,采用客户/服务器通信方式,在服务器上部署了提供各种服务的远程对象,客户端请求访问服务器上远程对象的方法,它要求客户端与服务器端都是 Java 程序
RMI 框架采用代理来负责客户与远程对象之间通过 Socket 进行通信的细节。RMI 框架为远程对象分别生成了客户端代理和服务器端代理。位于客户端的代理必被称为存根(Stub),位于服务器端的代理类被称为骨架(Skeleton)
当客户端调用远程对象的一个方法时,实际上是调用本地存根对象的相应方法。存根对象与远程对象具有同样的接口。存根采用一种与平台无关的编码方式,把方法的参数编码为字节序列,这个编码过程被称为参数编组。RMI 主要采用Java 序列化机制进行参数编组。存根把以下请求信息发送给服务器:
- 被访问的远程对象的名字
- 被调用的方法的描述
- 编组后的参数的字节序列
服务器端接收到客户端的请求信息,然后由相应的骨架对象来处理这一请求信息,骨架对象执行以下操作:
- 反编组参数,即把参数的字节序列反编码为参数
- 定位要访问的远程对象
- 调用远程对象的相应方法
- 获取方法调用产生的返回值或者异常,然后对它进行编组
- 把编组后的返回值或者异常发送给客户
客户端的存根接收到服务器发送过来的编组后的返回值或者异常,再对它进行反编组,就得到调用远程方法的返回结果
JDK5.0 之后,RMI 框架会在运行时自动为运程对象生成动态代理类(包括存根和骨架类),从而更彻底地封装了 RMI 框架的实现细节,简化了 RMI 框架的使用方式
2、创建 RMI 应用
创建一个 RMI 应用包括以下步骤:
- 创建远程接口:继承 java.rmi.Remote 接口
- 创建远程类:实现远程接口
- 创建服务器程序:负责在 RMI 注册器中注册远程对象
- 创建客户程序:负贵定位远程对象,并且调用远程对象的方法
1. 创建远程接口
远程接口中声明了可以被客户程序访问的远程方法,并直接或间接继承 java.rmi.Remote 接口
import java.rmi.*;
public interface HelloService extends Remote {
public String echo(String msg) throws RemoteException;
}
2. 创建远程类
远程类必须实现一个远程接口,此外,为了