首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java RMI - UnicastRemoteObject: UnicastRemoteObject.exportObject()和扩展UnicastRemoteObject有什么区别?

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

Stack Overflow用户
提问于 2010-02-04 03:48:22
回答 4查看 31.3K关注 0票数 18

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

它是关于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代替?如果之前没有绑定对象并且执行了重新绑定,会发生什么呢?

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

这就是我的想法:

  • 第一个类直接实现接口UnicastRemoteObject,这意味着在运行时创建注册表,并将对象自动导出到注册表。
  • 由于对象已绑定到注册表,因此必须重新绑定,而不是正常绑定。
  • 后者显式地完成所有这些操作。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-04 05:17:42

java.rmi.server.UnicastRemoteObject用于使用Java remote Method Protocol (JRMP)导出远程对象,并获取与远程对象通信的存根。

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

在那里,您应该遵循Javadoc

票数 5
EN

Stack Overflow用户

发布于 2010-02-15 10:44:46

这里有两个问题。

  1. 您可以扩展UnicastRemoteObject,也可以调用UnicastRemoteObject.exportObject().,这取决于您自己。第一个是简单且自动的;第二个意味着您可以扩展另一个类。
  2. 您可以使用外部的RMI Registry,也可以自己在服务器JVM中创建它。同样,你要做什么取决于你,这两种方式都有好处。

这两个问题没有interaction.

  • If,您还可以获得hashCode()equals()方法的“远程语义”的好处,这样所有存根看起来都与导出它们的远程对象相同,但这在客户端没有实际用途,实际上只是为了支持RMI实现本身。
票数 20
EN

Stack Overflow用户

发布于 2013-11-26 09:58:19

在需要扩展任何其他类的场景中,您可以调用UnicastRemoteObject.exportObject()而不是扩展UnicastRemoteObject。我认为总体效果是一样的。

See this

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2194935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档