RMI-远程方法调用
RMI支持存储于不同地址空间(不同Jvm)的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。提供服务的一端被称为服务端,使用服务的为客户端。
实现RMI的一个前提是 服务端和客户端实现同一个接口,此接口必须满足以下两点:
- 继承自 java.rmi.Remote
- 接口内的每个方法声明抛出 throws RemoteException
一个最简单的RMI例子:服务器会提供一个WorldClock服务,允许客户端获取指定时区的时间
public interface WorldClock extends Remote {
LocalDateTime getLocalDateTime(String zoneId) throws RemoteException;
}
服务端分为两部分,一部分是服务的实现,一部分是将服务以RMI的形式暴露在网络上
- 服务的实现
public class WorldClockService implements WorldClock{
@Override
public LocalDateTime getLocalDateTime(String zoneId) throws RemoteException {
return LocalDateTime.now(ZoneId.of(zoneId)).withNano(0);
}
}
- 将服务以RMI的形式暴露在网络上
public class Server{
public static void main(String[] args) throws RemoteException {
WorldClock worldClock = new WorldClockService();
WorldClock skeleton = (WorldClock)UnicastRemoteObject.exportObject(worldClock, 0);
Registry registry = LocateRegistry.createRegistry(1009);
registry.rebind(WorldClock.class.getSimpleName(), skeleton);
}
}
- 客户端调用服务
public class Client{
public static void main(String[] args) throws RemoteException, NotBoundException {
Registry registry = LocateRegistry.getRegistry("localhost", 1009);
WorldClock worldClock = (WorldClock) registry.lookup(WorldClock.class.getSimpleName());
LocalDateTime now = worldClock.getLocalDateTime("Asia/Shanghai");
System.out.println(now);
}
}