我正在准备考试,我有一个问题,希望有人能回答我。
它关于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);
...
}
}
我的问题是:这两者有什么区别?
在第一个版本中,注册表是明确创建的,此外,远程对象是在重新绑定内创建的。
我真的很好奇,为什么在第一个我需要自己创建注册表,但不需要显式导出对象,只需使用命名重新绑定。
该对象已经绑定到注册表之前,还是可以使用bind?如果对象以前没有被绑定,并且重新绑定是否出色,会发生什么?
在第二个版本中,注册表似乎已经被创建了?
为什么绑定到与绑定到注册表直接相同的命名?
如果你想让我包含任何更多的细节,请给我留言…
这就是我的想法:
>第一个类direclty实现接口UnicastRemoteObject,这意味着在运行时创建注册表,并将对象自动导出到RMI reg。
>因为对象已经绑定到注册表,必须重新绑定而不是正常的绑定
后者,明确地做了这一切