我有一个可以通过 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 引导问题:
使用 RMI 注册表。
通过 JNDI 与 LDAP 提供程序一起使用 LDAP 服务器。
Use UnicastRemoteObject,
序列化导出对象时获得的存根,并使用共享文件、套接字或sneakernet,使存根可供客户端使用。
使用RMI激活;序列化注册可激活时获得的存根,并将其与客户端应用程序一起分发到文件中的所有客户端。从存根分布的角度来看,这比 (3) 简单得多,因为存根在应用程序的生命周期中保持不变,而在 (3) 中,您必须在每次导出时重新分布存根。
您可以看到,注册表无疑是最简单的选择。请注意,您只需使用它解决引导问题一旦有了存根,您自己的应用程序远程方法就可以返回更多对象:注册表中不需要多个远程对象。您可以将其视为远程对象工厂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)