📅  最后修改于: 2020-11-15 03:18:58             🧑  作者: Mango
RMI代表远程方法调用。它是一种允许驻留在一个系统(JVM)中的对象访问/调用在另一个JVM上运行的对象的机制。
RMI用于构建分布式应用程序;它提供Java程序之间的远程通信。它在包java.rmi中提供。
在RMI应用程序中,我们编写两个程序,一个服务器程序(驻留在服务器上)和一个客户端程序(驻留在客户端上)。
在服务器程序内部,将创建一个远程对象,并使该对象的引用可用于客户端(使用注册表)。
客户端程序在服务器上请求远程对象,并尝试调用其方法。
下图显示了RMI应用程序的体系结构。
现在让我们讨论该体系结构的组件。
传输层-此层连接客户端和服务器。它管理现有连接并建立新连接。
存根-存根是客户端上远程对象的表示(代理)。它位于客户端系统中;它充当客户端程序的网关。
骨架-这是位于服务器端的对象。存根与此骨架进行通信,以将请求传递给远程对象。
RRL(远程参考层) -它是管理客户端对远程对象所做的参考的层。
以下几点总结了RMI应用程序的工作方式-
当客户端调用远程对象时,存根会接收到该对象,该存根最终将该请求传递给RRL。
当客户端RRL收到请求时,它将调用对象remoteRef的称为invoke()的方法。它将请求传递到服务器端的RRL。
服务器端的RRL将请求传递给骨架(服务器上的代理),该骨架最终在服务器上调用所需的对象。
结果一路传递回客户端。
每当客户端调用在远程对象上接受参数的方法时,这些参数就会捆绑成一条消息,然后再通过网络发送。这些参数可以是原始类型或对象。如果是原始类型,则将参数放在一起并在其上附加标题。如果参数是对象,则将其序列化。此过程称为编组。
在服务器端,打包的参数将取消捆绑,然后调用所需的方法。此过程称为解组。
RMI注册表是一个放置所有服务器对象的名称空间。每次服务器创建一个对象时,它将向RMIregistry注册该对象(使用bind()或reBind()方法)。这些是使用称为绑定名的唯一名称注册的。
要调用远程对象,客户端需要该对象的引用。那时,客户端使用其绑定名称(使用lookup()方法)从注册表中获取对象。
下图说明了整个过程-
以下是RMI的目标-