RMI服务器与RMI注册表

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

虽然Java远程方法调用(Java RMI)服务器理论上可以在任何主机上,但它通常与运行注册表的主机相同,并且位于不同的端口上。 即使服务器错误地了解其主机名或IP地址(或者主机名无法由客户端解析),它仍将使用错误的主机名导出其所有对象,但每次尝试时都会看到exception接收其中一个对象。

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

什么是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注册表能够提供远程对象BUT RMI服务器的引用,这是实际上托管远程对象或运行对象所在的JVM,找不到或客户端无法连接。

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

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

RMI服务器是托管远程对象的程序。 RMI注册表是一个单独的程序,它将远程对象名称绑定到实例。 RMI服务器通过在注册表中注册远程对象使客户端可以访问远程对象; 客户端然后通过相同的注册表获取访问权 RMI注册表一个小写的“服务器”,但它通常不是“RMI服务器”。

RMI服务器和RMI注册表之间的关系类似于Web服务器和对其具有权威性的DNS服务器之间的关系。

也许Oracle的入门指南比FAQ更好解释。

根据RMI规范#2.4.3 :

RMI服务器函数由java.rmi.server.RemoteObject及其子类java.rmi.server.RemoteServerjava.rmi.server.UnicastRemoteObject以及java.rmi.activation.Activatable.

我认为术语混淆不必要。 所有这些意味着每个远程对象都是服务器。 最好只考虑远程对象。 术语“RMI服务器”在RMI规范中恰好出现两次,并且两次都明确指的是远程对象。

Registry也是一个远程对象。 您获取远程对象作为远程方法的返回值。 注册表解决了如何开始的引导问题。

与此相反,您引用的Oracle FAQ似乎使用术语“RMI服务器”作为一种“托管”远程对象的程序:但是这种程序甚至不需要存在。 许多(如果不是大多数)远程对象只是“托管”自己。 将这样的程序描述为服务器只是滥用术语。

如果RMI注册表不是某种服务器,它如何工作?

这是一个远程对象。

简而言之。 RMI服务器在RMI注册表中注册其服务。 客户端不知道RMI服务器所在的位置,并引用RMI注册表来获取所需的服务。

您可以在此处找到更多信息,例如:

  • Java RMI简介