The result is passed all the way back to the client. The RRL on the server side passes the request to the Skeleton (proxy on the server) which finally invokes the required object on the server.
![quick user guide for universal type client quick user guide for universal type client](https://venturebeat.com/wp-content/uploads/2020/03/a-1.png)
It passes the request to the RRL on the server side. When the client-side RRL receives the request, it invokes a method called invoke() of the object remoteRef. When the client makes a call to the remote object, it is received by the stub which eventually passes this request to the RRL. The following points summarize how an RMI application works − RRL(Remote Reference Layer) − It is the layer which manages the references made by the client to the remote object. stub communicates with this skeleton to pass request to the remote object. Skeleton − This is the object which resides on the server side. It resides in the client system it acts as a gateway for the client program. Stub − A stub is a representation (proxy) of the remote object at client. It manages the existing connection and also sets up new connections. Transport Layer − This layer connects the client and the server.
![quick user guide for universal type client quick user guide for universal type client](https://venturebeat.com/wp-content/uploads/2018/11/sadf.png)
Let us now discuss the components of this architecture. The following diagram shows the architecture of an RMI application. The client program requests the remote objects on the server and tries to invoke its methods. Inside the server program, a remote object is created and reference of that object is made available for the client (using the registry). In an RMI application, we write two programs, a server program (resides on the server) and a client program (resides on the client). RMI is used to build distributed applications it provides remote communication between Java programs. It is a mechanism that allows an object residing in one system (JVM) to access/invoke an object running on another JVM.