RMI 服务器与 RMI 注册表

Cod*_*ein 3 java rmi distributed-computing

Oracle关于 Java RMI的 FAQ 页面上,它说:

虽然 Java 远程方法调用 (Java RMI) 服务器理论上可以位于任何主机上,但它通常与运行注册中心的主机位于同一主机上,并且位于不同的端口上。即使服务器弄错了它的主机名或 IP 地址(或者有一个根本不能被客户端解析的主机名),它仍然会使用这个错误的主机名导出它的所有对象,但是你每次尝试都会看到一个异常接收这些对象之一。

我不明白 RMI 服务器和 RMI 注册表之间的区别。我以为它们是同一回事。如果 RMI Registry 不是某种服务器,它如何工作?

hag*_*wal 6

什么是 RMI 注册表:

RMI 注册表是一种服务,其中注册远程对象并由 RMI 客户端查找注册的远程对象。如果您希望您的对象可以远程访问(可能有很多原因,例如您不断更新逻辑并且每次都无法发送到实现,因此允许通过 RMI 进行远程调用)然后在 RMI 注册表中注册它,然后在 RMI 中注册客户端将查找远程对象(使用对象的远程引用),然后可以调用远程对象上的方法。

以下是Oracle Javadoc 中注册表的定义

注册表是将名称映射到远程对象的远程对象。服务器向注册表注册其远程对象,以便可以查找它们。当对象想要调用远程对象上的方法时,它必须首先使用其名称查找远程对象。注册表向调用对象返回对远程对象的引用,使用该引用可以调用远程方法。

什么是RMI服务器:

RMI 服务器是运行 JVM 且对象(远程对象)存在的实际服务器。RMI 客户端最终需要这个对象。

根据您的担忧,是的,此服务器(RMI 服务器)可能与运行 RMI 注册表的服务器不同。你可以理解为什么!我可以在同一个 RMI 注册表中注册来自不同服务器的对象,并且我可以在完全不同的服务器上运行该注册表。请阅读以下更多内容以获得更多解释。

Java RMI 客户端如何联系远程 Java RMI 服务器?

为了让 Java RMI 客户端联系远程 Java RMI 服务器,客户端必须首先持有对服务器的引用(这是 RMI 注册表出现的地方,为您提供对 RMI 服务器的引用)。Naming.lookup 方法调用是客户端最初获取对远程服务器的引用的最常见机制。

每个远程引用都包含一个服务器主机名和端口号,允许客户端定位为特定远程对象提供服务的 VM(这是 RMI 服务器出现的地方)。一旦 Java RMI 客户端拥有远程引用,客户端将使用引用中提供的主机名和端口来打开到远程服务器的套接字连接。

请务必从相同的 Oracle 常见问题解答中阅读此内容

您可以很好地与 RMI 注册表连接,但您可能无法获取远程对象,这就是人们报告的时候java.net.UnknownHostException,这意味着 RMI 注册表能够提供远程对象的引用,但实际上托管远程对象的 RMI 服务器或运行对象所在的 JVM,未找到或客户端无法连接。

因此,RMI 注册表和 RMI 服务器是两个不同的东西。

一个类比可能是 HTTP 服务器用于提供对服务器上可用的 HTTP 资源(超文本文档)的访问。但是,通常超文本文档将与 HTTP 服务器位于同一物理框上,但 RMI 注册表可以提供对位于不同服务器(RMI 服务器)上的远程对象的引用的访问。