四、一个简单RMI应用的实现
一个正常工作的RMI系统由下面几个部分组成:
● 远程服务的接口定义
● 远程服务接口的具体实现
● 桩(Stub)和框架(Skeleton)文件
● 一个运行远程服务的服务器
● 一个RMI命名服务,它允许客户端去发现这个远程服务
● 类文件的提供者(一个HTTP或者FTP服务器)
● 一个需要这个远程服务的客户端程序
1、远程服务的接口定义
RMI对接口有着强烈的依赖。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节。所以客户得到远程对象的一个句柄正好同一些本地的根代码连接,有后者负责通过网络通信。但我们并不关心这些事情,通过自己的接口句柄发送消息即可。
创建一个远程接口时,必须遵守下列规则:
1)、远程接口必须为public属性(不能有“包访问”;也就是说,他不能是“友好的”)。否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得到一个错误。、
2)、远程接口必须扩展接口java.rmi.Remote。
3)、除与应用程序本身有关的违例,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException.
4)、作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远程接口,不可声明为实施类。
第一步就是建立和编译服务接口的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.
}
注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。
2、远程服务接口的具体实现
第二步,对远程服务接口的具体实现,这是一个CalculatorImpl类文件:
//CalculatorImpl.java
//Implementation
import java.rmi.server.UnicastRemoteObject
public class CalculatorImpl extends UnicastRemoteObject implements Calculator
{
public CalculatorImpl()
throws java.rmi.RemoteException {
super().
}
public long add(long a, long b)
throws java.rmi.RemoteException {
return a b.
}
public long sub(long a, long b)
throws java.rmi.RemoteException {
return a - b.
}
public long mul(long a, long b)
throws java.rmi.RemoteException {
return a * b.
}
public long div(long a, long b)
throws java.rmi.RemoteException {
return a / b.
}
}
这个实现类使用了UnicastRemoteObject去联接RMI系统。在这个例子中,是直接的从UnicastRemoteObject这个类上继承的,事实上并不一定要这样做,如果一个类不是从UnicastRmeoteObject上继承,那必须使用它的exportObject()方法去联接到RMI。
如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。当这个构造函数调用了super(),它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。
3、桩(Stubs)和框架(Skeletons)
接下来就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。
>rmic CalculatorImpl
在相关目录下运行上面的命令,成功执行完上面的命令将会发现一个Calculator_stub.class文件,如果使用的Java2SDK,那么还可以发现Calculator_Skel.class文件。