Unit 1 - 2 RMI
Unit 1 - 2 RMI
Unit 1 - 2 RMI
RMI Programming
To set JAVA_HOME in Windows 10 (Java Claspath)
• Open Control Panel and Select System and Security.
• Select System.
• Select Advanced System Settings.
• Select Environment Variables
• Under “System variables” click the “New…” button and enter
JAVA_HOME as “Variable name” and the path to your Java JDK
directory under “Variable value”
• Update System PATH
1. In “Environment Variables” window under “System variables”
select Path
2. Click on “Edit…”
3. In “Edit environment variable” window click “New”
4. Type in %JAVA_HOME%\bin
• Verify Java path by typing javac in command prompt
2
RMI (Remote Method Invocation)
3
Understanding stub and skeleton
• RMI uses stub and skeleton object for communication with
the remote object.
• A remote object is an object whose method can be invoked
from another JVM. Let's understand the stub and skeleton
objects:
4
stub
• The stub is an object, acts as a gateway for the client side.
All the outgoing requests are routed through it. It resides at
the client side and represents the remote object. When the
caller invokes method on the stub object, it does the
following tasks:
• It initiates a connection with remote Virtual Machine
(JVM),
• It writes and transmits (marshals) the parameters to the
remote Virtual Machine (JVM),
• It waits for the result
• It reads (unmarshals) the return value or exception, and
• It finally, returns the value to the caller.
5
skeleton
• The skeleton is an object, acts as a gateway for the server
side object. All the incoming requests are routed through it.
When the skeleton receives the incoming request, it does the
following tasks:
• It reads the parameter for the remote method
• It invokes the method on the actual remote object, and
• It writes and transmits (marshals) the result to the caller.
6
In the Java 2 SDK, an stub protocol was introduced that
eliminates the need for skeletons.
7
Understanding requirements for the distributed applications
8
Java RMI Example
9
RMI Example
• In this example, we have followed all the 6 steps to create and run the rmi
application. The client application need only two files, remote interface and client
application. In the rmi application, both client and server interacts with the remote
interface. The client application invokes methods on the proxy object, RMI sends
the request to the remote JVM. The return value is sent back to the proxy object and
then to the client application.
10
1) create the remote interface
• For creating the remote interface, extend the Remote
interface and declare the RemoteException with all the
methods of the remote interface. Here, we are creating a
remote interface that extends the Remote interface. There is
only one method named add() and it declares
RemoteException.
import java.rmi.*;
public interface Adder extends Remote{
public int add(int x,int y)throws RemoteException;
}
11
2) Provide the implementation of the remote interface
• Now provide the implementation of the remote interface. For
providing the implementation of the Remote interface, we need to
• Either extend the UnicastRemoteObject class, or use the
exportObject() method of the UnicastRemoteObject class
• In case, you extend the UnicastRemoteObject class, you must define a
constructor that declares RemoteException.
import java.rmi.*;
import java.rmi.server.*;
public class AdderRemote extends UnicastRemoteObject implements Adder{
AdderRemote()throws RemoteException{
super();
}
public int add(int x,int y){
return x+y;
} }
12
3) create the stub and skeleton objects using the rmic tool.
• Next step is to create stub and skeleton objects using the rmi
compiler. The rmic tool invokes the RMI compiler and
creates stub and skeleton objects.
• rmic AdderRemote
13
4) Start the registry service by the rmiregistry tool
• Now start the registry service by using the rmiregistry tool.
If you don't specify the port number, it uses a default port
number. In this example, we are using the port number
5000.
• rmiregistry 5000
14
5) Create and run the server application
• Now rmi services need to be hosted in a server process. The
Naming class provides methods to get and store the remote
object. The Naming class provides 5 methods.
15
• In this example, we are binding the remote object by the
name raghavan .
import java.rmi.*;
import java.rmi.registry.*;
public class MyServer{
public static void main(String args[]){
try{
Adder stub=new AdderRemote();
Naming.rebind("rmi://localhost:5000/raghavan",stub);
}catch(Exception e){System.out.println(e);}
}
}
16
6) Create and run the client application
• At the client we are getting the stub object by the lookup() method of
the Naming class and invoking the method on this object. In this
example, we are running the server and client applications, in the
same machine so we are using localhost. If you want to access the
remote object from another machine, change the localhost to the host
name (or IP address) where the remote object is located.
import java.rmi.*;
public class MyClient{
public static void main(String args[]){
try{
Adder stub=(Adder)Naming.lookup("rmi://localhost:5000/raghavan");
System.out.println(stub.add(34,4));
}catch(Exception e){}
}
} 17
For running this rmi example,
1) compile all the java files
javac *.java
2)create stub and skeleton object by rmic tool
rmic AdderRemote
3)start rmi registry in one command prompt
rmiregistry 5000
4)start the server in another command prompt
java MyServer
5)start the client application in another command prompt
java MyClient
18
Real Time example of RMI application with database
• Consider a scenario, there are two applications running in
different machines. Let's say MachineA and MachineB,
machineA is located in United States and MachineB in
India. MachineB want to get list of all the customers of
MachineA application.
19