我有一个可以通过 RMI 连接的服务对象。目前我正在这样做:
服务器
Registry r = LocateRegistry.createRegistry(1234);
r.bind("server", UnicastRemoteObject.exportObject(remoteServer, 0));
客户端
RemoteServer s = LocateRegistry.getRegistry("example.com", 1234).lookup("server");
服务器上的注册表只有一个用途,即链接到单个服务器对象。我认为我也可以在服务器上执行此操作:
UnicastRemoteObject.exportObject(remoteServer, 1234);
但是我该如何从客户端连接到服务器对象呢?
最佳答案
RMI Registry的存在就是为了解决RMI bootstrap问题,简单来说就是只能通过远程方法调用获取远程 stub ,而要进行远程方法调用就需要远程 stub 。 LocateRegistry.getRegistry()
提供的注册表引用解决了这个问题(如果您正在使用该 API,则由 Naming.lookup()
在内部使用)。 [请注意,此 stub 不是是通过远程方法获得的:它是使用您提供的主机:端口在本地合成的。如果它们不正确,您将直到使用注册表 stub 才能发现。]
您有多种选择来解决 RMI Bootstrap 问题:
使用 RMI 注册表。
通过 JNDI 将 LDAP 服务器与 LDAP 提供程序一起使用。
使用
UnicastRemoteObject,
序列化导出对象时获得的 stub ,并使用共享文件、套接字或sneakernet,使 stub 可供客户端使用。使用 RMI 激活;序列化注册可激活时获得的 stub ,并与客户端应用程序一起分发给文件中的所有客户端。从 stub 分发的角度来看,这比 (3) 简单得多,因为 stub 在应用程序的生命周期内保持不变,而在 (3) 中,您必须在每次导出时重新分发 stub 。
<
您可以看到注册表无疑是最简单的选项。请注意,您只需使用它来解决 Bootstrap 问题 一旦您有了一个 stub ,您自己的应用程序远程方法就可以返回更多的对象:您不需要在注册表中有一个以上的远程对象。您可以将其视为远程对象工厂。
关于java - 服务器通过 RMI 无需注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4864206/