RMI能让一个Java程序去调用网络中另一台计算机的Java对象的方法,调用的效果就跟在本机上调用一样。RMI架构基于一个重要的原理:定义接口和定义接口的具体实现是分开的。
现在来实现一个RMI编程的小例子,实现远程方法调用实现计算a+b。
定义接口部分
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface SomeInterface extends Remote { //要继承Remote类
public int add(int a, int b) throws RemoteException; //抛出RemoteException类型的错误
}
接口的实现部分
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
//要接口的实现要继承UnicastRemoteObject类
public class SomeImpl extends UnicastRemoteObject implements SomeInterface {
private int a;
private int b;
//即使无参构造函数什么也做也要写上,因为要抛出RemoteException错误
protected SomeImpl() throws RemoteException {
a = 1;
b = 1;
}
public SomeImpl(int a, int b) throws RemoteException{
this.a = a;
this.b = b;
}
//实现接口中声明的函数
@Override
public int add(int a, int b) throws RemoteException {
System.out.println("结果为:" + (a + b));
return a + b;
}
}
接口声明和实现都完成后就开始编写服务器端和客户端的工作了。
服务器端
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class AddServer {
public static void main(String[] args){
try {
LocateRegistry.createRegistry(1099); //启动RMI注册服务,默认端口号1099。
SomeImpl someimpl = new SomeImpl(); //创建远程对象的一个实例。
Naming.rebind("add", someimpl); //远程对象的绑定。
System.out.println("success");
} catch (RemoteException e) {
System.out.println("false");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("false");
e.printStackTrace();
}
}
}
最后编写客户端
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Scanner;
public class AddClient {
public static void main(String[] args){
try {
int a, b;
Scanner input = new Scanner(System.in);
//使用Naming.lookup()寻找注册的远程对象
SomeInterface add = (SomeInterface) Naming.lookup("add");
a = input.nextInt();
b = input.nextInt();
//调用远程方法
System.out.println(add.add(a, b));
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
最终结果展示
客户端输入a和b的值,然后调用远程对象add中的add(a, b)方法,然后服务器端返回他们相加的结果。
服务器端
服务器端成功启动,并成功接收客户端的请求并返回相加结果。