当前位置: 首页 > 文档资料 > Java RMI 中文文档 >

介绍

优质
小牛编辑
118浏览
2023-12-01

RMI代表Remote Method Invocation 。 它是一种允许驻留在一个系统(JVM)中的对象访问/调用在另一个JVM上运行的对象的机制。

RMI用于构建分布式应用程序; 它提供Java程序之间的远程通信。 它在java.rmi包中提供。

RMI应用程序的体系结构

在RMI应用程序中,我们编写两个程序,一个server program (驻留在服务器上)和一个client program (驻留在客户端上)。

  • 在服务器程序内部,创建一个远程对象,并为该客户端提供该对象的引用(使用注册表)。

  • 客户端程序请求服务器上的远程对象并尝试调用其方法。

下图显示了RMI应用程序的体系结构。

RMI架构

现在让我们讨论一下这种架构的组成部分。

  • Transport Layer - 此层连接客户端和服务器。 它管理现有连接并设置新连接。

  • Stub - 存根是客户端远程对象的表示(代理)。 它驻留在客户端系统中; 它充当客户端程序的网关。

  • Skeleton - 这是驻留在服务器端的对象。 stub与此框架通信以将请求传递给远程对象。

  • RRL(Remote Reference Layer) - 它是管理客户端对远程对象的引用的层。

使用RMI应用程序

以下几点总结了RMI应用程序的工作原理 -

  • 当客户端调用远程对象时,存根会收到最终将该请求传递给RRL的存根。

  • 当客户端RRL收到请求时,它会调用对象remoteRef一个名为invoke()的方法。 它将请求传递给服务器端的RRL。

  • 服务器端的RRL将请求传递给Skeleton(服务器上的代理),最终调用服务器上的所需对象。

  • 结果一直传递回客户端。

编组和解编

每当客户端调用接受远程对象上的参数的方法时,参数都会在通过网络发送之前捆绑到消息中。 这些参数可以是原始类型或对象。 在基本类型的情况下,将参数放在一起并且将标题附加到其上。 如果参数是对象,则将它们序列化。 此过程称为marshalling

在服务器端,打包参数是非捆绑的,然后调用所需的方法。 这个过程称为unmarshalling

RMI注册表

RMI注册表是放置所有服务器对象的命名空间。 每次服务器创建一个对象时,它都会使用RMIregistry(使用bind()reBind()方法)注册该对象。 这些是使用称为bind name的唯一名称注册的。

要调用远程对象,客户端需要该对象的引用。 那时,客户端使用其绑定名称从注册表中获取对象(使用lookup()方法)。

下图说明了整个过程 -

注册处

RMI的目标

以下是RMI的目标 -

  • 最小化应用程序的复杂性。
  • 保护类型安全。
  • 分布式垃圾收集。
  • 最大限度地减少使用本地和远程对象之间的差异。

最后更新:

类似资料

  • 我正在Java开发一个游戏,使用RMI进行所有网络通信。RMI允许我在服务器上调用方法,但对我来说还不够。我还希望服务器能够在连接的客户端之间传播消息。 我的客户机查找服务器(它的接口扩展为远程)并在其上注册。它允许服务器知道谁已连接。我的客户机还实现了一个扩展远程的接口。这是我的代码的一部分: 接口声明: 服务器端: 客户端: 此解决方案适用于本地,但当我尝试通过Internet使用它时则不起作

  • 我在JavaRMI应用程序中的SSL握手开始时遇到了一些问题。 我的应用程序与标准 RMI 套接字配合良好,但如果按照本指南将默认套接字更改为 SSL 套接字,则无法完成握手:https://blogs.oracle.com/lmalventosa/entry/using_the_ssl_tls_based 因此,我将可激活服务器的构造函数从 到 然后,我按照以下指南创建了一个密钥库和一个信任库:

  • 在没有任何Java RMI经验的情况下,我有一个天真的问题,但在搜索互联网后仍然不确定答案。 问题: 对我来说,有两种情况: 场景1:从本地启动一个Java程序,在执行过程中,它从存储在远程机器上的类调用一个方法,然后该方法的类将下载到本地机器上,并继续执行。 场景2:从本地启动Java程序,在执行过程中,它从存储在远程机器上的类调用一个方法,然后该方法将在远程机器上执行,结果将发送回本地机器。(

  • 问题是使用RMI的客户机-服务器通信-我不知道如何返回在服务器空间上运行的对象(或对对象的引用)之类的东西,返回给客户机,然后我可以从该客户机调用该客户机的方法。我需要这个,因为基本的RMI示例仅仅是将字符串或int等数据从服务器传递到客户端,而不是在服务器上运行的完全序列化的对象。 我发现的唯一类似问题是,在RMI中是否可以通过引用传递? 我想做的是: 服务器:创建并导出远程对象(实现远程接口)

  • 我正在实现一个简单的JavaRMI应用程序。它的主要目标是加2个整数。代码源如下:客户端和服务器端的AdditionInterface

  • 在运行gradlew测试时得到了这个错误: 第二次成功了。

相关阅读