Java 关于RMI的几个问题:远程方法调用

Java 关于RMI的几个问题:远程方法调用,java,rmi,Java,Rmi,我正在努力学习RMI,我有一个我从学校学到的RMI的例子。代码分为三部分。有一个接口(HelloIF)、一个服务器(HelloServer)和一个客户端(HelloClient)。在服务器部分,还有一个名为HelloImpl的接口实现 现在,在服务器中,他们将HelloImpl作为一个对象。然后他们把它打回HelloIF并把这个所谓的存根注册到注册表。我问自己,为什么他们首先创建HelloImpl对象,然后将其键入HelloIF接口并在注册表中注册。那么注册表中现在有存根对象了?或者只是引用实际

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

现在,在服务器中,他们将HelloImpl作为一个对象。然后他们把它打回HelloIF并把这个所谓的存根注册到注册表。我问自己,为什么他们首先创建HelloImpl对象,然后将其键入HelloIF接口并在注册表中注册。那么注册表中现在有存根对象了?或者只是引用实际的远程对象(HelloImpl),对吗?同样在RMI中,他们谈到了存根和骨架,但是这个HelloIF存根是存根还是仅仅是一个不吉利的名字

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

服务器代码:(最重要)

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;
}
客户端代码:(最重要)

他们把它做成了一件物品

但是他们把它打回了HelloIF

不对。见下文

并将这个所谓的存根注册到注册表

关于这件事没有所谓的说法。这是一个存根

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

他们不会“将其类型转换回
HelloIF
界面”。它们通过返回类型为
Remote
UnicastRemoteObject.exportObject()
导出对象,并返回存根,然后将其键入
HelloIF
。查一查

那么注册表中现在有存根对象了

或者只是引用实际的远程对象(HelloImpl),对吗

不,见上文

同样在RMI中,他们谈到了存根和骨架,但是这个HelloIF存根是存根还是仅仅是一个不吉利的名字

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

服务器是否返回存根对象

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

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


是。

请不要发布截图。只需复制粘贴您的代码,作为奖励,它更容易。请看:Refer,它还用示例解释了概念。忘掉这些随意的网络垃圾,看看网页。
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);
   }