1.定义一个远程接口
注意:必须继承Remote接口,需要被远程调用的方法必须抛出RemoteException异常。
package services;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Calculator extends Remote {
public long add(long a, long b) throws RemoteException;
public long sub(long a, long b) throws RemoteException;
public long mul(long a, long b) throws RemoteException;
public long div(long a, long b) throws RemoteException;
}
2.实现远程接口
注意:继承UnicaseRemoteObject类不是必须的,如果不继承该类,创建远程对象时就必须用该类的exportObject静态方法将远程对象连接到RMI系统。
当继承该类后,其子类必须提供一个声明抛出RemoteException异常的构造方法,当这个构造方法调用super()时,他会执行连接到RMI系统和对远程对象的初始化。
package services.impl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import services.Calculator;
public class CalculatorImpl extends UnicastRemoteObject implements Calculator {
private static final long serialVersionUID = 3964373047936852203L;
public CalculatorImpl() throws RemoteException {
super();
}
@Override
public long add(long a, long b) throws RemoteException {
return a+b;
}
@Override
public long div(long a, long b) throws RemoteException {
return a-b;
}
@Override
public long mul(long a, long b) throws RemoteException {
return a*b;
}
@Override
public long sub(long a, long b) throws RemoteException {
return a/b;
}
}
3.服务器端
package server;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import services.Calculator;
import services.impl.CalculatorImpl;
/**
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
*/
public class Server {
public static void main(String args[]) {
try {
// 在服务器上创建远程对象注册表Registry的实例,并指定端口为8888(Java默认端口是1099),缺少注册表创建,则无法绑定对象到远程注册表上
Registry registry = LocateRegistry.createRegistry(8888);
// 创建一个远程对象
Calculator calculator = new CalculatorImpl();
// 把远程对象注册到RMI注册服务器上,并命名为calculator
registry.rebind("calculator", calculator);
// 下面是另一种绑定方式,URL标准格式为:rmi://host:port/name(其中协议名可以省略)
// Naming.bind("//localhost:8888/RHello",rhello);
System.out.println("远程对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
}
}
}
4.客户端
package client;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import services.Calculator;
/**
* 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。
*/
public class Client {
public static void main(String args[]) {
try {
//运行时输入服务器的ip
//获取服务器的远程对象注册表实例
Registry registry = LocateRegistry.getRegistry(args[0], 8888);
//从注册表中查找以绑定的名为“calculator”的远程对象
Calculator calculator = (Calculator) registry.lookup("calculator");
System.out.println("1 + 2 = " + calculator.add(1, 2));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}