通过 RMI 的服务器,无需注册

2024-05-11

我有一个可以通过 RMI 连接的服务对象。目前我正在这样做:

Server

Registry r = LocateRegistry.createRegistry(1234);
r.bind("server", UnicastRemoteObject.exportObject(remoteServer, 0));

Client

RemoteServer s = LocateRegistry.getRegistry("example.com", 1234).lookup("server");

服务器上的注册表只有一种用途,即链接到单个服务器对象。我想我也可以在服务器上这样做:

UnicastRemoteObject.exportObject(remoteServer, 1234);

但是那么我如何从客户端连接到服务器对象呢?


RMI注册表的存在是为了解决RMI引导问题,简单地说,您只能通过远程方法调用来获取远程存根,而要执行远程方法调用,您需要远程存根。注册表参考提供者LocateRegistry.getRegistry()解决了这个问题(并被内部使用Naming.lookup()如果您正在使用该 API)。 [注意这个存根isn't通过远程方法获取:它是使用您提供的主机:端口在本地合成的。如果它们不正确,你将不会发现直到您使用注册表存根。]

您有多种选择来解决 RMI 引导问题:

  1. 使用 RMI 注册表。

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 RMI 的服务器,无需注册 的相关文章

随机推荐