RMI中命名和注册表之间的区别

时间:2012-03-19 14:15:55

标签: java registry rmi

我用过

Naming.rebind("rmi://localhost:1099/RmiServer", c);

其中c是远程对象。并且

 XYZ robj=new XYZ();
 ABC stub = (ABC) UnicastRemoteObject.exportObject(robj, 0);
 Registry registry = LocateRegistry.getRegistry();
 registry.bind("RmiServer", stub);

其中stub是远程对象。

如果rmiregistry已经运行,第一种情况正常工作,但后者抛出ServerException that ClassNotFoundException为ABC类抛出。我哪里错了?

此外,Naming and Registry different如何命名绑定到本地主机,而后来是动态获取相应的端口和地址,然后将对象绑定到它。

1 个答案:

答案 0 :(得分:3)

  

如果rmiregistry正在运行,第一种情况正常   已经,但后者正在抛出ServerException   ABC类抛出ClassNotFoundException。我要去哪里   错?

你已经回到了前面。如果您使用单独的rmiregistry,如果远程接口和存根等不在rmiregistry的CLASSPATH上,您将获得ClassNotFoundExceptions。如果您通过LocateRegistry.createRegistry()启动了不可能发生的注册表,否则导出将在bind()之前失败。

  

此外,Naming和Registry在这个意义上有何不同   命名绑定到本地主机,而后来正在获取   动态地对应端口和地址,然后绑定对象   它。

Naming提供了一组与注册表连接的静态方法,您无需调用LocateRegistry.getRegistry()。 API非常相似,但名称字符串不同:它们是基于URL的。

使用Naming类,所有名称字符串都是RMI URL,例如RMI://本地主机:1099 /。所有方法都是如此:bind(),rebind(),unbind(),lookup()和list()。

使用Registry接口,所有名称字符串都只是字符串,例如<服务器名称>

因此,如果您在代码的不同部分使用这两个类,则需要保持这一点以确保互操作性。例如,可以在Registry接口中使用命名样式的URL,它们只被视为字符串,但是Naming.list()的结果将类似于rmi:// localhost:1099 / rmi:// localhost :1099 /<服务器名称&gt ;.所以不要这样做。

在这两种情况下,从list()返回的名称与您提供给其他方法的名称相同。