关于RMI的一些问题:远程方法调用

时间:2015-09-15 18:36:42

标签: java rmi

我试图学习RMI,我确实有一个RMI的例子,我从学校得到的。代码分为三部分。有一个接口(HelloIF),一个服务器(HelloServer)和一个客户端(HelloClient)。在服务器部分,还有一个名为 HelloImpl 的接口实现。

现在,在服务器中,他们创建了HelloImpl的对象。但随后他们将其强制转换回HelloIF并将此所谓的存根注册到注册表中。 Iam问自己为什么他们首先创建HelloImpl的对象,然后将其强制转换回HelloIF接口并在注册表中注册它。那么注册表现在有了stub对象吗?或者只是引用实际的远程对象(HelloImpl)或者?同样在RMI中他们讨论了存根和骨架,但是这个HelloIF存根是存根还是只是一个不吉利的选择名称?

也有人可以用简单的英语解释RMI如何更好地工作?服务器是否返回存根对象?或者只是从服务器上的远程对象调用方法的返回值。

服务器代码:(最重要的)

    try {
        logger.debug("Creating stub");
        HelloImpl obj = new HelloImpl();
        HelloIF stub = (HelloIF) UnicastRemoteObject.exportObject(obj, 0);

        logger.debug("Locating registry on host '" + hostname + "'");
        Registry registry = LocateRegistry.getRegistry(hostname);
        logger.debug("Trying to register stub using name '" +    HelloIF.servicename + "'");
        registry.rebind(HelloIF.servicename, stub);
        logger.debug("Stub registered");

        logger.info("Server ready");
  }

HelloIF接口代码:

package example.interfaces.hello;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface HelloIF extends Remote {

    public static final String servicename = "Hello";

    String sayHello() throws RemoteException;
}

客户代码:(最重要的)

 try {
        logger.debug("Locating registry on " + hostname);
        Registry registry = LocateRegistry.getRegistry(hostname);

       logger.info("Contents of registry: " + Arrays.toString(registry.list()));

       HelloIF stub = (HelloIF) registry.lookup(HelloIF.servicename);
       logger.info("Found '" + HelloIF.servicename + "' in registry");

       logger.trace("Calling sayhello()");
       String response = stub.sayHello();
       logger.info("Response: " + response);
   } 

1 个答案:

答案 0 :(得分:1)

  

他们创建了HelloImpl的对象。

正确。

  

然后他们将它转换回HelloIF

不正确的。见下文。

  

并将此所谓的存根注册到注册表。

没有所谓的'关于它。它存根。

  

我问自己为什么他们首先创建HelloImpl的对象,然后将其强制转换回HelloIF接口并在注册表中注册。

他们没有'将其转发回HelloIF界面'。他们通过UnicastRemoteObject.exportObject()导出对象,其返回类型为Remote,并返回存根,并将 转换为HelloIF。查一查。

  

那么注册表现在有了stub对象吗?

正确。

  

或只是引用实际的远程对象(HelloImpl)吧?

不,见上文。

  

同样在RMI中他们谈论了存根和骨架,但是这个HelloIF存根是存根还是只是一个不吉利的选择名称?

这是存根。你读到的关于骷髅的任何内容都严重过时了。 1998年引入了一种不同的机制,并在2003年左右成为默认机制。

  

服务器是否返回存根对象?

没有。这个问题没有意义。 Registry 通过lookup()返回存根对象。服务器返回它实现的远程方法返回的任何内容。

  

或者只是从服务器上的远程对象调用方法的返回值。