分布式-RMI
RMI(Remote Method Invoke 远程方法调用)
主要涉及的接口和类如下图所示:
RMI 思维导图接口Remote:
远程对象的接口必须扩展Remote 接口。
接口中的所有方法还必须生命抛出RemoteException 异常(原因:远程方法调用缺乏本地调用的可靠性,远程调用总是存在失败的可能。)
异常RemoteException
每一次远程方法调用都必须捕获RemoteException 异常, 并且指明当调用不成功时应执行的相应的操作
类UnicastRemoteObject
类UnicastRemoteObject 的构造器使得它的对象可供远程访问。原因是它的构造器中调用了exportObject 方法。代码如下:
protected UnicastRemoteObject(int port) throws RemoteException{
this.port = port;
exportObject((Remote) this, port);
}
public static Remote exportObject(Remote obj, int port) throws RemoteException{
return exportObject(obj, new UnicastServerRef(port));
}
实现远程接口中声明方法的类可以继承类UnicastRemoteObject 或在远程对象的构造器中像如下方式调用exportObject 方法:
UnicastRemoteObject.exportObject(this,0); // 第二个参数为0,表明任何合适的端口都可用来监听客户连接。
类LocateRegistry
用于获取特定主机(包括本地主机)上远程对象注册表的引用,或用于创建一个接受对特定端口调用的远程对象注册表。
实际上通过LocateRegistry类方法获取到的是Registry对象引用(一个 stub),然后我们可以通过该Registry对象引用对“远程对象注册表”进行操作的。更进一步,没有Naming类照样可以进行所有的操作。
接口Registry
接口和类的关系如下:
RMI 使用的接口和类的关系图备注:
使用了Serializable 接口
Naming类提供存储和获得“远程对象注册表”上远程对象的引用的方法
Ref: