服务器通过没有注册表的RMI

时间:2011-02-01 15:08:30

标签: 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);

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

3 个答案:

答案 0 :(得分:13)

RMI注册表用于解决RMI引导程序问题,即只能通过远程方法调用获取远程存根,并且执行远程方法调用需要远程存根。 LocateRegistry.getRegistry()提供的注册表引用解决了此问题(如果您使用该API,则由Naming.lookup()在内部使用)。 [请注意,此存根不是通过远程方法获取:它使用您提供的host:port在本地进行合成。如果它们不正确,您将无法找到,直到您使用注册表存根。]

您有多种方法可以解决RMI引导问题:

  1. 使用RMI注册表。

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

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

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

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

答案 1 :(得分:1)

并非不可能,但不是非常实用,因为注册表将导出对象的存根对象传递给客户端(请参阅http://www.developer.com/print.php/3455311)。如果你没有其他机制,你就会陷入困境。在分布式系统中使用注册表还有其他好处,因此我实际上建议将其保留用于其他原因(位置透明度等)。

答案 2 :(得分:0)

客户端使用rmi URL,例如rmi:// localhost:2020 / server

请参阅https://stackoverflow.com/a/61210297/503025

相关问题