Java Rmi 简明教程

Java RMI - Introduction

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

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

Architecture of an RMI Application

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

  1. 在服务器程序内部,创建远程对象,并将该对象的引用提供给客户端(使用注册表)。

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

下图显示了 RMI 应用程序的架构。

rmi architecture

现在让我们讨论此架构的组件。

  1. Transport Layer − 此层连接客户端和服务器。它管理现有连接,并设置新连接。

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

  3. Skeleton − 这是驻留在服务器端的对象。 stub 与此骨架通信以将请求传递到远程对象。

  4. RRL(Remote Reference Layer) − 它是管理客户端对远程对象所做引用的层。

Working of an RMI Application

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

  1. 当客户端向远程对象发出调用时,它会被存根接收,然后存根最终会将此请求传递给 RRL。

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

  3. 服务器端的 RRL 将请求传递给骨架(服务器上的代理),最终在服务器上调用所需对象。

  4. 结果会一路传递回客户端。

Marshalling and Unmarshalling

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

在服务器端,已打包的参数将被解绑,然后调用所需的方法。此过程称为 unmarshalling

RMI Registry

RMI 注册表是在其上放置所有服务器对象的命名空间。每次服务器创建对象时,它都会使用 RMIregistry(使用 bind()reBind() 方法)注册此对象。它们使用称为 bind name 的唯一名称进行注册。

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

以下插图对整个过程进行了说明 −

registry

Goals of RMI

以下是 RMI 的目标 −

  1. 最大程度地减少应用程序的复杂性。

  2. To preserve type safety.

  3. Distributed garbage collection.

  4. 最大程度地减少使用本地对象和远程对象之间的差异。