我正在准备考试,我有一个问题,我希望这里的人能回答我。
它是关于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
重新绑定它。该对象以前是否已经绑定到注册表,或者我可以使用bind代替?如果之前没有绑定对象并且执行了重新绑定,会发生什么呢?
在第二个版本中,注册表似乎已经创建。为什么绑定到命名与直接绑定到注册表是相同的?
这就是我的想法:
发布于 2010-02-04 05:17:42
java.rmi.server.UnicastRemoteObject
用于使用Java remote Method Protocol (JRMP)导出远程对象,并获取与远程对象通信的存根。
对于下面的构造函数和静态exportObject
方法,将获得要导出的远程对象的存根...
在那里,您应该遵循Javadoc
发布于 2010-02-15 10:44:46
这里有两个问题。
UnicastRemoteObject
,也可以调用UnicastRemoteObject.exportObject().
,这取决于您自己。第一个是简单且自动的;第二个意味着您可以扩展另一个类。这两个问题没有interaction.
hashCode()
和equals()
方法的“远程语义”的好处,这样所有存根看起来都与导出它们的远程对象相同,但这在客户端没有实际用途,实际上只是为了支持RMI实现本身。发布于 2013-11-26 09:58:19
在需要扩展任何其他类的场景中,您可以调用UnicastRemoteObject.exportObject()
而不是扩展UnicastRemoteObject
。我认为总体效果是一样的。
https://stackoverflow.com/questions/2194935
复制相似问题