Cat*_*ist 18 java export rmi interface
我正在准备考试,我有一个问题,我希望有人能回答我.
它是关于RMI和远程对象.我想知道为什么这两个实现之间存在很大差异.一个是扩展UnicastRemoteObject,而另一个是将对象导出为UnicastRemoteObject.
我真的没有区别
接口:
public interface EchoI extends Remote {
public String echo() throws RemoteException
}
Run Code Online (Sandbox Code Playgroud)
这是服务器代码(版本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";
}
}
Run Code Online (Sandbox Code Playgroud)
这将是版本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);
...
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:这两者有什么区别?
在第一个版本中,显式创建了注册表,而且在重新绑定中创建了远程对象?
我真的好奇,为什么在第一个我需要自己创建注册表但不需要显式导出对象并只使用重新绑定它Naming.该对象之前是否已绑定到注册表,或者我可以使用bind吗?如果对象之前没有绑定并重新绑定,会发生什么?
在第二个版本中,注册表似乎已经创建.为什么绑定命名与直接绑定到注册表相同?
这就是我的想法:
use*_*421 19
这里有两个问题.
您可以延长UnicastRemoteObject或致电UnicastRemoteObject.exportObject().您所做的事由您决定.第一个是简单和自动的; 第二个意味着你可以扩展另一个类.
您可以使用外部RMI注册表,也可以在服务器JVM中自行创建.你做的再取决于你,两种方式都有优势.
这两个问题没有互动.
如果您extend UnicastRemoteObject还为hashCode()和equals()方法获得了"远程语义"的好处,那么所有存根看起来都与导出它们的远程对象相同,但这在客户端没有实际用途,并且实际上只在那里支持RMI实现本身.
| 归档时间: |
|
| 查看次数: |
27422 次 |
| 最近记录: |