当前位置: 首页 > 面试题库 >

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

阳建弼
2023-03-14
问题内容

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

关于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注册表。
  • 因为对象已经绑定到注册表,所以必须进行重新绑定而不是常规绑定。
  • 后者明确地完成了所有这一切。

问题答案:

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

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

在那里,您应该遵循Javadoc



 类似资料:
  • 问题内容: 用Java导入和扩展类有什么区别 问题答案: 那是两件事。 导入一个类是为了使您可以使用该类,而无需在要编写的当前类中限定全名。 扩展类是创建一个新类,该新类是某个其他类的子类。这将允许您添加或更改要扩展的类的功能。

  • 问题内容: 我已经看过以前用来表示任何对象的通配符-但最近看到了以下用法: 由于所有对象都扩展了对象,所以这两种用法是同义词吗? 问题答案: 并且是同义的,正如你所期望的。 在某些情况下,泛型实际上并不是多余的。例如,将导致成为下删除,而与它会成为下删除。(如果你要保留与使用的前泛型API的兼容性,这可能很重要。) 来源:http : //download.oracle.com/javase/tu

  • 问题内容: 我无法理解为什么我们在PHP中需要2个XML解析器。 有人可以解释两者之间的区别吗? 问题答案: 简而言之: SimpleXml 用于简单的XML和/或简单的UseCases 与节点一起使用的有限API(例如,不能对接口进行太多编程) 所有节点属于同一种类(元素节点与属性节点相同) 节点可以魔术访问,例如 DOM 适用于您可能拥有的任何XML UseCase 是W3C DOM API的

  • 那么,和到底有什么区别呢?什么时候我们应该偏爱一个而不是另一个?

  • 扩展是可定制化浏览体验的小程序,它们使用户可以根据个人需要或者偏好定制 Chrome 的功能和行为。它们基于 Web 技术(例如 HTML,JavaScript 和 CSS)构建。 扩展必须满足狭义定义且易于理解的单一目的(译者注:功能简单易懂化)。一个扩展可以包括多个组件和一系列功能,只要所有的内容都有助于实现共同的目标。 用户交互界面应尽量小且有意图。他们的范围从简单的图标,如右侧显示的 Go

  • 关键字可以与方法和类一起使用,但是如果我们与方法一起使用,那么方法就不能被重写,如果我们与类一起使用,那么它就不能被扩展?为此,请让我知道覆盖和扩展的主要区别是什么? 例如下面的程序给出编译错误(编译时间错误):