我用过
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
如何命名绑定到本地主机,而后来是动态获取相应的端口和地址,然后将对象绑定到它。
答案 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()返回的名称与您提供给其他方法的名称相同。