我正在为一场考试做准备,有一个问题希望这里的某人能回答我。
它与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";
}
}
这将是第二个版本:
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
就可以重新绑定它。那个对象是否已经绑定到注册表中,或者我可以使用 bind 来代替呢?如果对象以前没有绑定,那么执行重新绑定会发生什么?
在第二个版本中,注册表似乎已经被创建。
为什么将命名绑定与直接绑定到注册表相同?
这是我认为的:
- 第一个类直接实现了 UnicastRemoteObject 接口,这意味着在运行时注册表会被创建,并且对象会自动导出到 RMI 注册表中。
- 由于对象已经绑定到注册表中,因此必须进行重新绑定而不是正常绑定。
- 后者都是显式完成的。