虽然我将我的服务器绑定(bind)到 RMI 注册表,以便客户端可以从众所周知的源查找服务,但我需要更多地了解 RMI 机制,因为我不想在将来使用注册表,而我的客户端应该能够为他们想要联系的特定服务器创建 UnicastRemoteObject
(或其子类)。
我觉得这个问题实际上可能有一个明显的答案,但如果有人可以指导我完成这些步骤,我确实会很感激。客户端需要了解什么才能创建 stub 并使用远程服务?
所以,我在一台设备上有一个服务器,并且我有一个想要使用此服务的客户端。服务器对象已导出,但尚未注册到服务器和客户端都知道的位置的目录上。客户端是否可以自己创建一个 stub ,而不必使用服务器导出的 stub ?服务器需要什么信息来创建 stub ?服务器的IP?港口?还有什么?如何将所有这些信息放在一起来创建 stub ?
我不想使用注册表,因为使用注册表过于集中。我实际上有一个设备集群,它们既充当客户端又充当服务器,这些设备提供并使用相同的服务。每个设备代表自己的自主神经元,它们一起发挥作用就像一个神经系统。
当非集群成员的设备被集群成员占用时,集群就会增长。一旦非成员设备成为成员,与其接合的成员就让其他成员知道现在新成员的 stub ,以便其他成员可以尝试接合新成员。使用注册表不会给这个集群带来任何有值(value)的东西。
如果没有注册表,第一个与非成员(member)互动的成员(member)是“手动”完成的。我想,当非成员设备启动并且非成员设备让运算符(operator)知道(通过某些显示)必须用于创建允许第一个成员设备使用它的 stub 的参数时,此手动过程将会有所帮助。
最佳答案
“为特定服务器创建一个UnicastRemoteObject
”是没有意义的。任何时候您创建一个,它都会在本地主机上运行。 [有一个异常(exception),但不适用于本例。]
Can the client create a stub itself rather than having to use the one that was exported by the server?
没有。 [同样有一个异常(exception),因为这正是 Registry.locateRegistry()
所做的,但它使用您不知道的类,所以您不能。]
您必须解释您对将注册表用于此目的(如 RMI 设计者的意图)的厌恶。
编辑您真正需要的是分布式注册表。没有(也不可能)适用于 RMI/JRMP,但您可以调查 RMI/IIOP 和合适的 ORB 供应商,这对他们来说就是肉和饮料。或者通过 JNDI 使用中央 LDAP 服务器而不是注册表。
关于java - 在客户端上生成 RMI stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36475018/