RMI注册表
为了获取对远程对象的引用,RMI提供了名为注册表(registry)的一个远程对象,它将名称与远程对象关联起来。RMI服务器要向注册表注册每一个远程对象,以便定位和检索对象。RMI客户端希望调用远程对象上的一个方法时,首先必须根据远程对象的名称在注册表中定位远程对象。如果远程对象存在,注册表就返回对那个对象的一个引用。然后,要使用这个引用来发出对远程对象的方法调用。
RMI服务器
RMI采取一种客户机/服务器结构进行通信。这意味着在RMI会话的某一端,必须有一个对象充当服务器,另一端的对象则充当客户端。RMI服务器负责创建每个远程对象的实例,并将每个实例和RMI注册表中的一个名称绑定起来。RMI服务器可以自主,这要求它实现一个main方法,避免必须依赖其他类才能执行。
由于RMI服务器可从几乎任何主机下载和执行代码,所以每个RMI服务器的main方法都需要安装一个安全管理器,防止它所加载的类表现失常。下例展示了如何实例化一个安全管理器,以及如何在RMI注册表中绑定一个对象实例:
import java.rmi.RMISecurityManager;
import java.rmi.Naming;
public class SimpleRMIServer
{
public static void main(String[] args)
{
if (System.getSecurityManager() == null)
{
System.setSecurityManager(new RMISecurityManager());
}
try
{
TimeKeeperImplremoteObj = new TimeKeeperImpl();
// Bind the remote object to the name "TimeKeeper"
Naming.bind("//HostName/TimeKeeper", remoteObj);
System.out.println("TimeKeeper successfully bound in registry");
}
catch (Exception e)
{
System.err.println("Error binding TimeKeeper: " + e.getMessage());
}
}
}
小结
本文简单介绍了如何用RMI来隐藏远程交互问题,使程序员能将注意力集中在其他更重要的问题上,而不必过多地考虑通信基础结构。下一篇文章将进一步探索RMI,讲解RMI客户端如何定位远程对象,并调用其上的方法。
