java - 服务器通过 RMI 无需注册

标签 java networking registry rmi rmiregistry

我有一个可以通过 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 问题:

  1. 使用 RMI 注册表。

  2. 通过 JNDI 将 LDAP 服务器与 LDAP 提供程序一起使用。

  3. 使用UnicastRemoteObject,序列化导出对象时获得的 stub ,并使用共享文件、套接字或sneakernet,使 stub 可供客户端使用。

  4. 使用 RMI 激活;序列化注册可激活时获得的 stub ,并与客户端应用程序一起分发给文件中的所有客户端。从 stub 分发的角度来看,这比 (3) 简单得多,因为 stub 在应用程序的生命周期内保持不变,而在 (3) 中,您必须在每次导出时重新分发 stub 。

    <

您可以看到注册表无疑是最简单的选项。请注意,您只需使用它来解决 Bootstrap 问题 一旦您有了一个 stub ,您自己的应用程序远程方法就可以返回更多的对象:您不需要在注册表中有一个以上的远程对象。您可以将其视为远程对象工厂。

关于java - 服务器通过 RMI 无需注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4864206/

相关文章:

java - 尝试关闭文件系统时出错

java - Firebase - 按(孙) child 的存在进行查询

java - 来自用户的 Apache Tomcat 服务器屏蔽过程

windows - 拥有一个装满旧东西的注册表会减慢 Windows 的速度吗?

java - 在 Java 中如何使用 Byte Buddy 分配给字段?

ios - 如何获取附近 wifi 网络的列表并能够从我们的 ios 应用程序连接到它们(为企业应用程序使用私有(private) API)?

sockets - gcloud 计算 : configure firewall for external traffic

c# - 我如何等待异步 ping 负载在 C# 中全部完成?

c# - 如何在安装应用程序的 hkey_classes_root 键上添加值

powershell - PowerShell强制参数取决于另一个参数