我正在准备考试,但有一个问题,希望这里有人可以回答我。
关于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?如果该对象先前未绑定并且执行了重新绑定,会发生什么情况?
Naming
在第二个版本中,注册表似乎已经创建。为什么绑定命名与直接绑定到注册表相同?
这就是我的想法:
java.rmi.server.UnicastRemoteObject 用于导出使用Java远程方法协议(JRMP)的远程对象并获得与该远程对象通信的存根。
java.rmi.server.UnicastRemoteObject
对于下面的构造函数和静态exportObject方法,已获取要导出的远程对象的存根…
exportObject
在那里,您应该遵循Javadoc