RMI远程方法调用允许在一台机器上执行的Java对象调用另一台机器上运行的Java对象,它允许我们构建分布式的应用程序。它的方法被包含在java.rmi包中
构建RMI程序的通常形式:
1。定义远程接口(扩展Remote接口,Remote没有成员,只是指明一个接口使用远程方法),主要是对要实现的功能在接口里说明,方法都抛出RemoteException异常。
2。实现远程接口(扩展/继承UnicastRemoteObject类,实现上面的远程接口)
3。服务器端程序:更新机器的RMI注册表。通过Naming的rebind方法,把名字和对象引用关联到一起。
4。客户端程序:这里的服务器URL必须使用RMI协议,字符串包括IP或名字以及字符串“AddServer”,然后调用Naming类的lookup方法。
实现远程加法计算程序例子:
//远程接口
import java.rmi.*;
public interface AddServerInterface extends Remote{
double add(double d1, double d2) throws RemoteException;
}
//远程实现
import java.rmi.*;
import java.rmi.server.*;
public class AddServerImplement extends UnicastRemoteObject
implements AddServerInterface{
public AddServerImplement() throws RemoteException{
}
public double add(double d1, double d2) throws RemoteException{
return d1 + d2;
}
}
//服务器
import java.net.*;
import java.rmi.*;
public class AddServer {
public static void main(String[] args) {
try{
AddServerImplement addsi = new AddServerImplement();
Naming.rebind("AddServer", addsi);
}catch(Exception e){
System.out.println("Exception : " + e);
}
}
}
//客户端
import java.rmi.*;
public class AddClient {
public static void main(String[] args) {
try{
String addServerURL = "rmi://" + args[0] + "/AddServer";
AddServerInterface addsi = (AddServerInterface)Naming.lookup(addServerURL);
System.out.println("The first number is:" + args[1]);
System.out.println("The sencond number is:" + args[2]);
double d1 = Double.valueOf(args[1]).doubleValue();
double d2 = Double.valueOf(args[2]).doubleValue();
System.out.println("The sum is:" + addsi.add(d1,d2));
}catch(Exception e){
e.printStackTrace();
}
}
}
程序完成后,需要生成存根(Stub,驻留于客户机上的Java对象,提供与远程服务同样的接口)和基干(Skeleton,Java2中不是必须,它是驻留于服务器上的Java对象)。用rmic AddServerImplement命令生成。(远程方法可接受简单类型的数据和对象作为参数。作为参数传递给远程方法的对象必须序列化(根据序列化的理论,序列化工具也会处理该对象的所有的引用对象))
生成Stub和Skeleton之后,需要把客户端(AddClient)、远程接口(AddServerInterface)、远程接口的基干(AddServerImplement_Stub)放在同一目录。
然后start rmiregistry 启动RMI注册表
接下来就是启动服务器和客户机了