一尘不染

Java RMI- UnicastRemoteObject:UnicastRemoteObject.exportObject()和扩展UnicastRemoteObject有什么区别?

java

我正在准备考试,但有一个问题,希望这里有人可以回答我。

关于RMI和远程对象。我不知道为什么这两个实现之间有如此大的差异。一种是扩展UnicastRemoteObject,而另一种是将对象导出为UnicastRemoteObject。

我真的没有区别

接口:

public interface EchoI extends Remote {
   public String echo() throws RemoteException
}

这是服务器代码(版本1):

public class EchoImpl extends UnicastRemoteObject implements EchoI {
    public EchoImpl {
        super();
    }

    public static void main (String[] args) {
        try {
            LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
            StoreHouse storehouseImpl = new StorehouseImpl();
            Naming.rebind("//localhost/StoreHouse.SERVICE_NAME", storehouseImpl);
            System.out.println("Server ready");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    public String echo() {
        return "echo";
    }
}

这将是版本2:

public class EchoImpl implements EchoI {
    public static void main (String[] args) {
        EchoI echoService = new EchoImpl();
        EchoI stub = (EchoI) UnicastRemoteObject.exportObject(echoService, 0);
        Registry registry = LocateRegistry.getRegistry();
        registry.bind("echoService", stub);
        ...
    }
}

我的问题是:两者之间有什么区别?

在第一个版本中,显式创建了注册表,此外,在重新绑定内创建了远程对象?

我真的很好奇,为什么为什么我首先需要自己创建注册表,而无需显式导出对象,而只需使用进行重新绑定Naming。该对象之前是否已经绑定到注册表,或者我可以改用bind?如果该对象先前未绑定并且执行了重新绑定,会发生什么情况?

在第二个版本中,注册表似乎已经创建。为什么绑定命名与直接绑定到注册表相同?

这就是我的想法:

  • 第一类Direclty实现了UnicastRemoteObject接口,这意味着在运行时创建注册表,并且该对象自动导出到RMI注册表。
  • 因为对象已经绑定到注册表,所以必须进行重新绑定而不是常规绑定。
  • 后者明确地完成了所有这一切。

阅读 382

收藏
2020-12-03

共1个答案

一尘不染

java.rmi.server.UnicastRemoteObject
用于导出使用Java远程方法协议(JRMP)的远程对象并获得与该远程对象通信的存根。

对于下面的构造函数和静态exportObject方法,已获取要导出的远程对象的存根…

在那里,您应该遵循Javadoc

2020-12-03