服务器通过RMI没有注册表
我有一个可以通过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注册表用于解决RMI引导程序问题,即只能通过远程方法调用获取远程存根,并且执行远程方法调用需要远程存根。 LocateRegistry.getRegistry()
提供的注册表引用解决了这个问题(如果您使用的是API,则由Naming.lookup()
在内部使用)。 [请注意,此存根不是通过远程方法获得的:它使用您提供的host:port在本地进行综合。 如果它们不正确,您将无法找到, 直到您使用注册表存根。 ]
您有多种选择来解决RMI引导程序问题:
-
使用RMI注册表。
-
通过JNDI将LDAP服务器与LDAP提供程序一起使用。
-
使用
UnicastRemoteObject,
序列化导出对象时获取的存根,并使用共享文件,套接字或sneakernet,使存根可供客户端使用。 -
使用RMI激活; 序列化注册可激活时获得的存根,并将其与客户端应用程序一起分发到文件中的所有客户端。 从存根分布的角度来看,这比(3)简单得多,因为存根在应用程序的生命周期内保持不变,而在(3)中,您必须在每次导出时重新分配存根。
您可以看到Registry当然是最简单的选择。 请注意,您只需使用它来解决引导问题一旦有了存根,您自己的应用程序远程方法就可以返回更多对象:您在注册表中不需要多个远程对象。 您可以将其视为远程对象工厂。
并非不可能,但不是非常实用,因为注册表将导出对象的存根对象传递给客户端(请参阅http://www.developer.com/print.php/3455311 )。 如果你没有其他机制,你就会陷入困境。 在分布式系统中使用注册表还有其他好处,因此我实际上建议保留它以用于其他原因(位置透明度等)。
- 签署使用maven-assembly插件创建的jar文件
- 从方法返回到新对象时,原始resultSet会发生什么?
- JAXRS客户端找不到邮件正文编写器
- 检查Java TCP服务器上的客户端断开连接 – 仅输出
- 在不指定对象类型的情况下创建ArrayList时,在添加第一个对象时是否自动创建它?
- 无法调试java.lang.NoClassDefFoundError:com / google / inject / internal / util / $ Preconditions
- java中的字符串解析
- 具有注释参数的切入点匹配方法
- 如果Java中的字符串中有多个空格,那么如何将它们压缩到单词之间的单个空格中?