我正在准备考试,我有一个问题,希望有人能回答我。
它是关于 RMI 和远程对象的。我想知道为什么这两种实现之间有如此大的差异。一种是扩展 UnicastRemoteObject,另一种是将对象导出为 UnicastRemoteObject。
我真的不明白其中的区别
界面:
public interface EchoI extends Remote {
public String echo() throws RemoteException
}
这是服务器代码(版本 1):
public class EchoImpl extends UnicastRemoteObject implements EchoI {
public EchoImpl {
super();
}
public static void main (String[] args) {
try {
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
StoreHouse storehouseImpl = new StorehouseImpl();
Naming.rebind("//localhost/StoreHouse.SERVICE_NAME", storehouseImpl);
System.out.println("Server ready");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public String echo() {
return "echo";
}
}
这将是版本 2:
public class EchoImpl implements EchoI {
public static void main (String[] args) {
EchoI echoService = new EchoImpl();
EchoI stub = (EchoI) UnicastRemoteObject.exportObject(echoService, 0);
Registry registry = LocateRegistry.getRegistry();
registry.bind("echoService", stub);
...
}
}
我的问题是:这两者有什么区别?
在第一个版本中,注册表是显式创建的,而且远程对象是在重新绑定中创建的?
我真的很好奇,为什么首先我需要自己创建注册表,但不需要显式导出对象,只需使用以下命令重新绑定它Naming
。该对象之前是否已绑定到注册表,或者我可以使用绑定来代替吗?如果该对象之前没有绑定并且执行了重新绑定,会发生什么?
在第二个版本中,注册表似乎已经创建了。
为什么绑定到命名与直接绑定到注册表相同?
这就是我的想法:
- 第一个类 direclty 实现了 UnicastRemoteObject 接口,这意味着在运行时创建注册表并将对象自动导出到 RMI 注册表。
- 由于对象已经绑定到注册表,因此必须进行重新绑定而不是正常绑定。
- 后者明确地执行了所有这些操作。
这里有两个问题。
您可以延长UnicastRemoteObject
或致电UnicastRemoteObject.exportObject().
你做什么取决于你。第一个是简单且自动的;第二个意味着您可以扩展另一个课程。
-
您可以使用外部 RMI 注册表,也可以在服务器 JVM 中自行创建。同样,你做什么取决于你自己,两种方式都有好处。
这两个问题没有交互作用。
If you extend UnicastRemoteObject
您还可以获得“远程语义”的好处hashCode()
and equals()
方法,这样所有存根看起来都与导出它们的远程对象相同,但这在客户端没有实际用途,实际上只是为了支持 RMI 实现本身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)