在客户端上生成 RMI 存根

Generating an RMI Stub on a Client

尽管我将我的服务器绑定到 RMI 注册表以便客户端可以从众所周知的来源查找服务,但我需要更多地了解 RMI 机制,因为我不想使用将来我的客户应该能够为他们想要联系的特定服务器创建 UnicastRemoteObject(或其子类)的注册表。

我觉得这个问题实际上可能有一个明显的答案,但如果有人能指导我完成这些步骤,我真的很感激。客户端需要知道什么才能创建存根和使用远程服务?

所以,我在一台设备上有一个服务器,我有一个客户端想要使用这个服务。服务器对象已导出,但尚未在服务器和客户端都已知的目录中注册。客户端是否可以自己创建一个存根,而不必使用服务器导出的存根?服务器需要什么信息来创建存根?服务器的IP?港口?还有什么?我如何收集所有这些信息来创建存根?

我不想使用注册表,因为使用注册表过于集中。我实际上有一个设备集群,它们既充当客户端又充当服务器,这些设备在其中提供和使用相同的服务。每个设备都代表自己的自主神经元,它们一起发挥作用就像一个神经系统。

当一个不是该集群成员的设备被集群成员使用时,该集群会增长。一旦非成员设备成为成员,它参与的成员就会让其他成员知道现在新成员的存根,以便其他成员可以尝试参与新成员。使用注册表不会给这个集群带来任何价值。

没有注册表,第一个与非会员互动的会员就是这样做的 "manually"。我想当非成员设备启动并且非成员设备让操作员知道(通过一些显示)必须用于创建允许第一个成员设备参与的存根的参数时,我想这个手动过程会有所帮助它。

'Create a UnicastRemoteObject for a specific server' 没有意义。任何时候创建一个,它都会在本地主机上运行。 [有一个例外,但不适用于这种情况。]

Can the client create a stub itself rather than having to use the one that was exported by the server?

没有。 [同样有一个例外,因为这正是 Registry.locateRegistry() 所做的,但它使用 类 你不知道,所以你不能。]

如 RMI 设计者所希望的那样,您将不得不解释您为什么不喜欢将注册表用于此目的。

编辑 您真正需要的是分布式注册表。 RMI/JRMP 没有(不可能),但您可以调查 RMI/IIOP 和合适的 ORB 供应商,这对他们来说是肉和饮料。或者通过 JNDI 而不是注册表使用中央 LDAP 服务器。

回答我自己的问题并不时髦,但我做了更多的研究,看来我的问题适合多播。

我找到了一个post here,其中讨论了将包含 RMI 存根的 UDP 数据包发送到多个设备的可行性。在我的实例中,发送方是非成员设备,接收方是成员集群。然后,这些成员设备将在它们之间进行组织,其中一个将尝试与发送者互动。

虽然引用的 post 示例代码的 link 似乎不再有效,但这看起来确实很有希望...