Java RMI - UnicastRemoteObject : what is the difference between UnicastRemoteObject. exportObject() 并扩展 UnicastRemoteObject?

标签 java interface export rmi

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

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

我真的不明白

接口(interface):

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

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

在第一个版本中,注册表是显式创建的,而且远程对象是在重新绑定(bind)中创建的?

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

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

这是我的想法:

  • 第一个类 direclty 实现了 UnicastRemoteObject 接口(interface),这意味着在运行时创建注册表并将对象自动导出到 RMI 注册表。
  • 由于对象已经绑定(bind)到注册表,因此必须进行重新绑定(bind)而不是正常绑定(bind)。
  • 后者明确地完成了所有这些工作。

最佳答案

这里有两个问题。

  1. 您可以扩展 UnicastRemoteObject 或调用 UnicastRemoteObject.exportObject()。 具体操作由您决定。第一个是简单和自动的;第二个意味着你可以扩展另一个类。

  2. 您可以使用外部 RMI 注册表或在您的服务器 JVM 中自行创建。同样,你做什么取决于你,这两种方式都有好处。

    这两个问题没有交互。

  3. 如果您扩展 UnicastRemoteObject,您还可以获得 hashCode()equals() 的“远程语义”的好处方法,这样所有 stub 看起来都与导出它们的远程对象相同,但这在客户端没有实际用途,实际上仅用于支持 RMI 实现本身。

关于Java RMI - UnicastRemoteObject : what is the difference between UnicastRemoteObject. exportObject() 并扩展 UnicastRemoteObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2194935/

相关文章:

Java:SortedMap、TreeMap、Comparable?如何使用?

java - 在方法中实现带有附加参数的接口(interface)

node.js - 在文件之间共享 mqtt 客户端对象

java - 快速排序 java.lang.StackOverflowError

Java WebSocket 服务器 OutputStream 不刷新

dictionary - 如何将接口(interface){}转换为结构指针?

android - 在导入到 Android 应用程序之前验证 sqlite 数据库

mysql - 线程 "main"java.lang.NoClassDefFoundError : sdb/sdbconfig 中的异常

Java - 将用户输入添加到 ArrayList,需要用另一个 ArrayList 中的变量分隔

java - 如何根据击键更改图像