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

添加新评论