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);
    }
}

标签: none

添加新评论