RMI 服务器与 RMI 注册表

RMI Server vs. RMI Registry

关于 Oracle's FAQ page 关于 Java RMI,它说:

While the Java Remote Method Invocation (Java RMI) server can theoretically be on any host, it is usually the same host as that on which the registry is running, and on a different port. Even if the server is mistaken about its hostname or IP address (or has a hostname that simply isn't resolvable by clients), it will still export all of its objects using that mistaken hostname, but you will see an exception every time you try to receive one of those objects.

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

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

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

也许 Oracle 的 getting started guide 解释比 FAQ 好一点。

来自RMI Specification #2.4.3

RMI server functions are provided by java.rmi.server.RemoteObject and its subclasses, java.rmi.server.RemoteServer and java.rmi.server.UnicastRemoteObject and java.rmi.activation.Activatable.

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

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

与此相反,您引用的 Oracle 常见问题解答似乎使用术语 'RMI server' 作为一种 'hosts' 远程对象的程序:但是这样的程序没有必要甚至存在。许多(如果不是大多数的话)远程对象只是 'host' 本身。将这样的程序描述为服务器只是对术语的误用。

How can the RMI Registry work if it wasn't a server of some sorts?

它是一个远程对象。

什么是 RMI 注册表:

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

下面是definition of registry from Oracle Javadoc

A registry is a remote object that maps names to remote objects. A server registers its remote objects with the registry so that they can be looked up. When an object wants to invoke a method on a remote object, it must first lookup the remote object using its name. The registry returns to the calling object a reference to the remote object, using which a remote method can be invoked.

什么是 RMI 服务器:

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

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

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

要让 Java RMI 客户端联系远程 Java RMI 服务器,客户端必须首先持有对服务器的引用(这是 RMI 注册表进入的地方图片,给你参考RMI服务器)。 Naming.lookup 方法调用是客户端最初获取对远程服务器的引用的最常见机制。

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

请务必阅读 this 来自相同的 Oracle 常见问题解答。

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

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

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