Java RMI - UnicastRemoteObject:UnicastRemoteObject.exportObject() 和 extends UnicastRemoteObject 之间有什么区别?

2024-01-17

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

它是关于 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。该对象之前是否已绑定到注册表,或者我可以使用绑定来代替吗?如果该对象之前没有绑定并且执行了重新绑定,会发生什么?

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

这就是我的想法:

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

这里有两个问题。

  1. 您可以延长UnicastRemoteObject或致电UnicastRemoteObject.exportObject().你做什么取决于你。第一个是简单且自动的;第二个意味着您可以扩展另一个课程。

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

    这两个问题没有交互作用。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java RMI - UnicastRemoteObject:UnicastRemoteObject.exportObject() 和 extends UnicastRemoteObject 之间有什么区别? 的相关文章

随机推荐

  • 为什么继承的接口无法在通用上下文中转换为其基接口?

    我正在尝试在我的 C 项目中实现接口继承系统 但无法让它工作 这是一个简化版本 public interface BaseInterface public abstract class AbstractClass
  • UITableView 检测选定的单元格?

    我的应用程序中有多个 UITableView 是否有一种方法可以检测用户在该列中选择了哪个单元格 行 还可以通过编程方式取消选择单元格 行吗 Thanks 获取表当前选择的索引路径 NSIndexPath path tableView in
  • Magento 将控制器复制到本地

    当我复制一些core Mage Adminhtml Block 文件到local Mage Adminhtml Block 一切正常 但如果我将控制器复制到local Mage Adminhtml controllers 核心控制器仍然有效
  • 一对一的聊天记录,包括开火和打拳

    我已经在我的系统中安装了 open fire 通过使用邮递员工具我可以创建用户 通过使用 smack 我也可以将消息发送给其他用户 但问题是我不知道如何获取两个用户之间的聊天历史记录 这意味着如果我发送发件人和收件人用户名 我需要获取以前的
  • Javascript 中的简单 HTML 清理器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个用 JavaScript 编写的简单 HTML 清理程序 它不需要 100 XSS 安全
  • CAShapeLayer 路径弹簧动画不“过度”

    我正在尝试使用 CASpringAnimation 对 CAShapeLayer 路径进行动画处理 预期的结果是形状之间的 变形 表现出 弹性 我有一个圆形和方形路径之间的基本代码示例 如下所示 但最终结果是一个弹簧动画 它不会 超出 最终
  • 如何让tinymce默认以纯文本粘贴

    谷歌搜索了数千次 没有人给出如何让 Tinymce 默认粘贴纯文本并在不单击 粘贴为文本 按钮的情况下删除任何格式的完整解决方案 关于如何实现它有什么想法吗 或者如何自动启用 粘贴为文本 按钮 谢谢 对于tinyMCE 3X 或4X 来说
  • 分割 html 标签

    div Hi HElP ME br p ok p p p div img class div b ok1 b div img class div p end p p p b b div I want to split this html c
  • 按 Enter 键退出 while 循环而不阻塞。我该如何改进这个方法?

    因此 我一直在阅读有关如何通过用户按 Enter 键退出 while 循环的一些内容 并得出以下结论 import sys select os switch 1 i 1 while switch 1 os system cls if os
  • 在选择选项中显示图像以供选择 -Django Python

    我正在开发一个项目 但我被困在订单页面上 在这里 我想在选项标签中显示产品图像列表 以便用户可以从所有图像中选择一张图像 或者可以上传图像 上传图像的功能正常工作 但选择不起作用 我想向用户显示图像 以便用户可以选择其中一张 模型 py c
  • javascript 输入只允许数字

    我使用这个代码并且它有效
  • 如何在 Javascript 中单击 标记时切换(隐藏/显示)表格

    我想显示和隐藏 切换 table onClick事件的 a 这是我的 a tag a href Login a 这是我的 Javascript 函数toggleTable hide a a table
  • 如何使用 Html.TextBoxFor 设置默认值?

    简单的问题 如果您使用 ASP NET MVC Framework 1 中的 Html Helper 则很容易在文本框上设置默认值 因为存在重载Html TextBox string name object value 当我尝试使用Html
  • ListView中自定义onInterceptTouchEvent

    我如何实现自定义onInterceptTouchEvent in a ListView给孩子的滚动优先权ListView一旦他们完成滚动 就将其返回给ListView 我想优先考虑内心的观点 尝试覆盖onInterceptTouchEven
  • 使用 WorkManager 的定期工作请求不起作用

    我正在尝试编写一个定期的 Workmanager 脚本 但它只是在我打开应用程序时运行 并且只运行一次 不是定期的 这是我的主要活动 public class MainActivity extends AppCompatActivity O
  • 为什么这个输入与另一个输入重叠?

    我在 Python 2 7 10 中创建了一个 TCP 服务器 一旦我输入我的用户名 它就会询问密码 而不是说 用户名 管理员 密码 管理员 it says 用户名 管理员 密码 昵称 昵称是密码后输入的 这是相关代码 def userna
  • 哪些 C++ 编译器已经支持 lambda?

    是否有 C 编译器已经支持C 0x http en wikipedia org wiki C 2B 2B0x lambda http en wikipedia org wiki Lambda calculus表达式 Visual Studi
  • 一些可重用代码的架构

    我正在编写一些小型 简单的应用程序 它们共享一个共同的结构 并且需要以相同的方式做一些相同的事情 例如日志记录 数据库连接设置 环境设置 并且我正在寻找一些构建这些应用程序的建议可重复使用的组件 该代码是用强静态类型语言编写的 例如 Jav
  • 将 git 命令记录到 Powershell 脚本中的奇怪差异

    See 这个问题 https stackoverflow com questions 58942723 powershell transcript is not capturing git output 58943306了解我试图理解的行为
  • Java RMI - UnicastRemoteObject:UnicastRemoteObject.exportObject() 和 extends UnicastRemoteObject 之间有什么区别?

    我正在准备考试 我有一个问题 希望有人能回答我 它是关于 RMI 和远程对象的 我想知道为什么这两种实现之间有如此大的差异 一种是扩展 UnicastRemoteObject 另一种是将对象导出为 UnicastRemoteObject 我