SlideShare a Scribd company logo
1 of 16
SRI KRISHNA ARTS AND SCIENCE COLLEGE
Java assignment
Topic:
Remote Method Invocation (RMI)
By,
ARUN.P
13BCA005
INTRODUCTION
The Remote Method Invocation (RMI)facilitates objectfunction calls
between Java Virtual Machines (JVMs).JVMs can be located on
separate computers - yet one JVM can invoke methods belongingto
an objectstored in anotherJVM.Methods can even pass objects that
a foreign virtual machine has neverencountered before,allowing
dynamic loadingof new classes as required.This is a powerful
feature!
Considerthe follow scenario:
 DeveloperA writes a service that performs some useful
function. He regularlyupdates this service, addingnew
features and improvingexisting ones.
 DeveloperB wishes to use the service provided by DeveloperA.
However,it's inconvenientfor A to supply B with an update
every time.
Java RMI provides a very easysolution! Since RMI can dynamically
load new classes,DeveloperB can let RMI handle updates
automaticallyfor him. DeveloperA places the new classes in a web
directory, where RMI can fetch the new updates as they are required.
Figure 1 - Connections made when clientuses RMI
Figure 1 shows the connections made by the client when using RMI.
Firstly, the client must contact an RMI registry, and requestthe
name of the service. DeveloperB won'tknow the exact location of the
RMI service, but he knows enough to contact DeveloperA's registry.
This will point him in the direction of the service he wants to call..
DeveloperA's service changes regularly, so DeveloperB doesn'thave
a copy of the class. Not to worry, because the client automatically
fetches the new subclass from a webserverwhere the two developers
share classes.The new class is loaded into memory,and the client is
ready to use the new class. This happens transparentlyfor Developer
B - no extra code need to be written to fetch the class.
HOW RMI WORKS?
When referencinga remote objectresidingon machine B from code
beingon machine a there are always two intermediate objects
actually handlingthe communication:a stub object and a skeleton
object.When a remote method invocation comes up the following
tasks are handled by these two objects (see also figure):
The stub object (on machine A) has to
o build an information block thats consists of
 an identifierof the remote objectto be used,
 an operation numberdescribingthe method to be
called and
 the marshalled parameters (method parameters
have to be encoded into a format suitable for
transportingthem across the net)
o send this information to the server
The tasks of the skeleton object (on machine B) are
o to unmarshal the parameters,
o to call the desired method on the real objectlying on the
server,
o to capture the return value or exception of the call on the
server,
o to marshal this value,
o to send a package consistingof the value in the
marshalled form back to the stub on the client, machine
A.
The stub object unmarshals the return value or exception from the
server. This value becomes the return value of the remote method
invocation.Or, if the remote method threw an exception,the stub
(object) rethrows it in the process space of the caller.
 Example
Let's assume there is a remote object belongingto the
class Product offering the method getDescription(),whose return
value is a String object. Let's further assume this method is invoked
by a remote machine (notvery surprising). The followingfigure
shows what is going on in order to handle this situation,on client
side as well as on server side.
UNDERSTANDING STUB AND SKELETON
RMI uses stub and skeleton objectfor communication with the
remote object.
A remote object is an object whose method can be invoked from
anotherJVM. Let's understand the stub and skeleton objects:
Stub
The stub is an object, acts as a gatewayfor the client side. All the
outgoingrequests 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 followingtasks:
1. It initiates a connection with remote Virtual Machine (JVM),
2. It writes and transmits (marshals)the parameters to the
remote Virtual Machine (JVM),
3. It waits for the result
4. It reads (unmarshals)the return value or exception,and
5. It finally, returns the value to the caller.
Skeleton
The skeleton is an object,acts as a gatewayfor the server side object.
All the incomingrequests are routed through it. When the skeleton
receives the incomingrequest,it does the followingtasks:
1. It reads the parameterfor the remote method
2. It invokes the method on the actual remote object, and
3. It writes and transmits (marshals)the result to the caller.
Steps to write the RMI program
This is given the 6 steps to write the RMI program.
1. Create the remote interface
2. Provide the implementation of the remote interface
3. Compile the implementationclass and create the stub and
skeleton objects usingthe rmic tool
4. Start the registry service by rmi registry tool
5. Create and start the remote application
6. Create and start the client application
Writing RMI services
Writing your own RMI services can be a little difficult at first, so
we'll start off with an example which isn't too ambitious.We'll create
a service that can calculate the square of a number,and the powerof
two numbers (238 for example).Due to the large size of the numbers,
we'll use the java.math.BigIntegerclass for returningvalues rather
than an integeror along.
Writing an interface
The first thing we need to do is to agree upon an interface, An
interface is a description of the methods we will allow remote clients
to invoke.Let's considerexactly what we'll need.
1. A method that accepts as a parameteran integer, squares it,
and returns a BigInteger
public BigIntegersquare ( int number_to_square );
2. A method that accepts as a parametertwo integers, calculates
their power, and returns a BigInteger
public BigIntegerpower( int num1,int num2 );
Once we've decided on the methods that will compose ourservice, we
have to create a Java interface. An interface is a method which
contains abstract methods;these methods mustbe implemented by
anotherclass. Here's the source code for our service that calculates
powers.
import java.math.BigInteger;
import java.rmi.*;
//
// PowerService Interface
//
// Interface for a RMI service that calculates powers
//
public interface PowerService extends java.rmi.Remote
{
// Calculate the square of a number
public BigIntegersquare ( int number)
throws RemoteException;
// Calculate the power of a number
public BigIntegerpower ( int num1, int num2)
throws RemoteException;
}
Our interface extends java.rmi.Remote,which indicates that this is a
remote service. We provide method definitions for our two methods
(square and power),and the interface is complete.The next step is to
implementthe interface, and provide methods for the square and
powerfunctions.
Implementing the interface
Implementingthe interface is a little more tricky - we actually have
to write the square and powermethods! Don'tworry if you're not sure
how to calculate squares and powers,this isn't a math lesson.The
real code we need to be concerned aboutis the constructor and main
method.
We have to declare a defaultconstructor, even when we don't have
any initialization code for our service. This is because ourdefault
constructor can throw a java.rmi.RemoteException,from its parent
constructor in UnicastRemoteObject.Sound confusing?Don'tworry,
because ourconstructor is extremelysimple.
public PowerServiceServer() throws RemoteException
{
super();
}
Our implementation of the service also needs to have a main method.
The main method will be responsiblefor creating an instance of our
PowerServiceServer,and registering (or binding)the service with the
RMI Registry. Our main method will also assign a security manager
to the JVM, to preventany nasty surprises from remotelyloaded
classes.In this case, a security managerisn't really needed,but in
more complexsystems where untrusted clients will be usingthe
service, it is critical.
public static void main ( String args[] ) throws Exception
{
// Assign a security manager,in the eventthat dynamic
// classes are loaded
if (System.getSecurityManager()== null)
System.setSecurityManager( new RMISecurityManager());
// Create an instance of our powerservice server ...
PowerServiceServersvr = new PowerServiceServer();
// ... and bind it with the RMI Registry
Naming.bind ("PowerService",svr);
System.out.println ("Service bound....");
}
Once the square and power methods are added, our server is
complete.Here's the full source code for the PowerServiceServer.
import java.math.*;
import java.rmi.*;
import java.rmi.server.*;
//
// PowerServiceServer
//
// Server for a RMI service that calculates powers
//
public class PowerServiceServer extends UnicastRemoteObject
implements PowerService
{
public PowerServiceServer() throws RemoteException
{
super();
}
// Calculate the square of a number
public BigIntegersquare ( int number)
throws RemoteException
{
String numrep = String.valueOf(number);
BigIntegerbi = new BigInteger(numrep);
// Square the number
bi.multiply(bi);
return (bi);
}
// Calculate the powerof a number
public BigIntegerpower( int num1,int num2)
throws RemoteException
{
String numrep = String.valueOf(num1);
BigIntegerbi = new BigInteger(numrep);
bi = bi.pow(num2);
return bi;
}
public static void main ( String args[] ) throws Exception
{
// Assign a security manager,in the eventthat dynamic
// classes are loaded
if (System.getSecurityManager()== null)
System.setSecurityManager( new RMISecurityManager());
// Create an instance of our power service server ...
PowerServiceServersvr = new PowerServiceServer();
// ... and bind it with the RMI Registry
Naming.bind ("PowerService",svr);
System.out.println ("Service bound....");
}
}
Writing a RMI client
What good is a service, if you don't write a client that uses it? Writing
clients is the easypart - all a client has to do is call the registry to
obtain a reference to the remote object,and call its methods.All the
underlyingnetworkcommunicationis hidden from view, which
makes RMI clients simple.
Our client must first assign a security manager,and then obtain a
reference to the service. Note that the client receives an instance of
the interface we defined earlier,and not the actual implementation.
Some behind-the-scenes workis going on, but this is completely
transparentto the client.
// Assign security manager
if (System.getSecurityManager()== null)
{
System.setSecurityManager (new RMISecurityManager());
}
// Call registry for PowerService
PowerService service = (PowerService)Naming.lookup
("rmi://" + args[0] + "/PowerService");
To identify a service, we specify an RMI URL. The URL contains the
hostname on which the service is located, and the logical name of the
service. This returns a PowerService instance,which can then be
used just like a local object reference.We can call the methods justas
if we'd created an instance of the remote PowerServiceServer
ourselves.
// Call remote method
System.out.println ("Answer: " + service.square(value));
// Call remote method
System.out.println ("Answer : " + service.power(value,power));
Writing RMI clients is the easiestpart of buildingdistributed
services. In fact, there's more code for the user interface menu in the
client than there is for the RMI components! To keep things simple,
there's no data validation,so be careful when enteringnumbers.
Here's the full source code for the RMI client.
import java.rmi.*;
import java.rmi.Naming;
import java.io.*;
//
//
// PowerServiceClient
//
//
public class PowerServiceClient
{
public static void main(Stringargs[]) throws Exception
{
// Checkfor hostname argument
if (args.length != 1)
{
System.out.println
("Syntax - PowerServiceClient host");
System.exit(1);
}
// Assign security manager
if (System.getSecurityManager()== null)
{
System.setSecurityManager
(new RMISecurityManager());
}
// Call registry for PowerService
PowerService service = (PowerService)Naming.lookup
("rmi://" + args[0] + "/PowerService");
DataInputStream din = new
DataInputStream (System.in);
for (;;)
{
System.out.println
("1 - Calculate square");
System.out.println
("2 - Calculate power");
System.out.println
("3 - Exit"); System.out.println();
System.out.print("Choice : ");
String line = din.readLine();
Integerchoice = new Integer(line);
int value = choice.intValue();
switch (value)
{
case 1:
System.out.print("Number : ");
line = din.readLine();System.out.println();
choice = new Integer (line);
value = choice.intValue();
// Call remote method
System.out.println
("Answer : " + service.square(value));
break;
case 2:
System.out.print("Number : ");
line = din.readLine();
choice = new Integer (line);
value = choice.intValue();
System.out.print("Power : ");
line = din.readLine();
choice = new Integer (line);
int power = choice.intValue();
// Call remote method
System.out.println
("Answer: " + service.power(value,power));
break;
case 3:
System.exit(0);
default:
System.out.println ("Invalid option");
break;
}
}
}
}
Running the client and server
Our example was extremelysimple.More complex systems,however,
might contain interfaces that change, or whose implementation
changes.To run this article's examples,both the client and server
will have a copy of the classfiles,but more advanced systems might
share the code of the server on a webserver,for downloadingas
required.If your systems do this, don't forget to set the system
propertyjava.rmi.server.codebaseto the webserverdirectory in which
your classes are stored!
You can download all the source and class files togetheras a single
ZIP file. Unpack the files into a directory, and then perform the
followingsteps.
1. Start the rmiregistry
To start the registry, Windows users should do the following
(assumingthat your javabin directoryis in the current path):-
start rmiregistry
To start the registry, Unix users should do the following:-
rmiregistry &
2. Compile the server
Compile the server, and use the rmic tool to create stub files.
3. Start the server
From the directory in which the classes are located, type the
following:-
java PowerServiceServer
4. Start the client
You can run the client locally, or from a different machine.In
either case, you'll need to specify the hostnameof the machine
where you are runningthe server. If you're runningit locally,
use localhostas the hostname.
java PowerServiceClientlocalhost
TIP - If you runningthe client or server with JDK1.2,
then you'll need to change the security settings.You'll
need to specify a security policy file (a sample is
included with the source code and classes) when you
run the client and server.
The followingchanges should be made when running
the server
java -Djava.security.policy=java.policy
PowerServiceServer
The followingchanges should be made when running
the client
java -Djava.security.policy=java.policy
PowerServiceClientlocalhost

More Related Content

Viewers also liked (20)

Jdbc 1
Jdbc 1Jdbc 1
Jdbc 1
 
Java Servlets & JSP
Java Servlets & JSPJava Servlets & JSP
Java Servlets & JSP
 
Java servlets
Java servletsJava servlets
Java servlets
 
Java rmi
Java rmiJava rmi
Java rmi
 
Ravi Tuppad
Ravi TuppadRavi Tuppad
Ravi Tuppad
 
Rmi architecture
Rmi architectureRmi architecture
Rmi architecture
 
Introduction in jsp & servlet
Introduction in jsp & servlet Introduction in jsp & servlet
Introduction in jsp & servlet
 
Basic java
Basic java Basic java
Basic java
 
Introduction To Rmi
Introduction To RmiIntroduction To Rmi
Introduction To Rmi
 
Rmi
RmiRmi
Rmi
 
Java RMI
Java RMIJava RMI
Java RMI
 
Networking
NetworkingNetworking
Networking
 
Rmi ppt-2003
Rmi ppt-2003Rmi ppt-2003
Rmi ppt-2003
 
Java networking programs - theory
Java networking programs - theoryJava networking programs - theory
Java networking programs - theory
 
Java beans
Java beansJava beans
Java beans
 
Java chapter 5
Java chapter 5Java chapter 5
Java chapter 5
 
Java 1-contd
Java 1-contdJava 1-contd
Java 1-contd
 
Java swing 1
Java swing 1Java swing 1
Java swing 1
 
Java rmi
Java rmiJava rmi
Java rmi
 
Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)
 

Similar to remote method invocation

Similar to remote method invocation (20)

Rmi
RmiRmi
Rmi
 
Remote method invocatiom
Remote method invocatiomRemote method invocatiom
Remote method invocatiom
 
Remote Method Invocation in JAVA
Remote Method Invocation in JAVARemote Method Invocation in JAVA
Remote Method Invocation in JAVA
 
Remote Method Invocation
Remote Method InvocationRemote Method Invocation
Remote Method Invocation
 
Distributed Objects and JAVA
Distributed Objects and JAVADistributed Objects and JAVA
Distributed Objects and JAVA
 
Remote method invocation
Remote method invocationRemote method invocation
Remote method invocation
 
Distributed objects
Distributed objectsDistributed objects
Distributed objects
 
Rmi ppt
Rmi pptRmi ppt
Rmi ppt
 
Remote Method Invocation
Remote Method InvocationRemote Method Invocation
Remote Method Invocation
 
Module 3 remote method invocation-2
Module 3   remote method  invocation-2Module 3   remote method  invocation-2
Module 3 remote method invocation-2
 
Call Back
Call BackCall Back
Call Back
 
Module 1 Introduction
Module 1   IntroductionModule 1   Introduction
Module 1 Introduction
 
Call Back
Call BackCall Back
Call Back
 
Call Back
Call BackCall Back
Call Back
 
Call Back
Call BackCall Back
Call Back
 
17rmi
17rmi17rmi
17rmi
 
DS
DSDS
DS
 
Remote Method Invocation
Remote Method InvocationRemote Method Invocation
Remote Method Invocation
 
Java rmi example program with code
Java rmi example program with codeJava rmi example program with code
Java rmi example program with code
 
ADB Lab Manual.docx
ADB Lab Manual.docxADB Lab Manual.docx
ADB Lab Manual.docx
 

More from Arun Nair

SAP in PRECOT MERIDIAN Ltd.
SAP in PRECOT MERIDIAN Ltd.SAP in PRECOT MERIDIAN Ltd.
SAP in PRECOT MERIDIAN Ltd.Arun Nair
 
basic programs in C++
basic programs in C++ basic programs in C++
basic programs in C++ Arun Nair
 
retrieving data using SQL statements
retrieving data using SQL statementsretrieving data using SQL statements
retrieving data using SQL statementsArun Nair
 
process models- software engineering
process models- software engineeringprocess models- software engineering
process models- software engineeringArun Nair
 
BITCOIN TECHNOLOGY(AAappZZ)
BITCOIN TECHNOLOGY(AAappZZ)BITCOIN TECHNOLOGY(AAappZZ)
BITCOIN TECHNOLOGY(AAappZZ)Arun Nair
 

More from Arun Nair (6)

SAP in PRECOT MERIDIAN Ltd.
SAP in PRECOT MERIDIAN Ltd.SAP in PRECOT MERIDIAN Ltd.
SAP in PRECOT MERIDIAN Ltd.
 
basic programs in C++
basic programs in C++ basic programs in C++
basic programs in C++
 
c++
c++ c++
c++
 
retrieving data using SQL statements
retrieving data using SQL statementsretrieving data using SQL statements
retrieving data using SQL statements
 
process models- software engineering
process models- software engineeringprocess models- software engineering
process models- software engineering
 
BITCOIN TECHNOLOGY(AAappZZ)
BITCOIN TECHNOLOGY(AAappZZ)BITCOIN TECHNOLOGY(AAappZZ)
BITCOIN TECHNOLOGY(AAappZZ)
 

remote method invocation

  • 1. SRI KRISHNA ARTS AND SCIENCE COLLEGE Java assignment Topic: Remote Method Invocation (RMI) By, ARUN.P 13BCA005
  • 2. INTRODUCTION The Remote Method Invocation (RMI)facilitates objectfunction calls between Java Virtual Machines (JVMs).JVMs can be located on separate computers - yet one JVM can invoke methods belongingto an objectstored in anotherJVM.Methods can even pass objects that a foreign virtual machine has neverencountered before,allowing dynamic loadingof new classes as required.This is a powerful feature! Considerthe follow scenario:  DeveloperA writes a service that performs some useful function. He regularlyupdates this service, addingnew features and improvingexisting ones.  DeveloperB wishes to use the service provided by DeveloperA. However,it's inconvenientfor A to supply B with an update every time. Java RMI provides a very easysolution! Since RMI can dynamically load new classes,DeveloperB can let RMI handle updates automaticallyfor him. DeveloperA places the new classes in a web directory, where RMI can fetch the new updates as they are required. Figure 1 - Connections made when clientuses RMI
  • 3. Figure 1 shows the connections made by the client when using RMI. Firstly, the client must contact an RMI registry, and requestthe name of the service. DeveloperB won'tknow the exact location of the RMI service, but he knows enough to contact DeveloperA's registry. This will point him in the direction of the service he wants to call.. DeveloperA's service changes regularly, so DeveloperB doesn'thave a copy of the class. Not to worry, because the client automatically fetches the new subclass from a webserverwhere the two developers share classes.The new class is loaded into memory,and the client is ready to use the new class. This happens transparentlyfor Developer B - no extra code need to be written to fetch the class. HOW RMI WORKS? When referencinga remote objectresidingon machine B from code beingon machine a there are always two intermediate objects actually handlingthe communication:a stub object and a skeleton object.When a remote method invocation comes up the following tasks are handled by these two objects (see also figure): The stub object (on machine A) has to o build an information block thats consists of  an identifierof the remote objectto be used,  an operation numberdescribingthe method to be called and  the marshalled parameters (method parameters have to be encoded into a format suitable for transportingthem across the net) o send this information to the server The tasks of the skeleton object (on machine B) are o to unmarshal the parameters,
  • 4. o to call the desired method on the real objectlying on the server, o to capture the return value or exception of the call on the server, o to marshal this value, o to send a package consistingof the value in the marshalled form back to the stub on the client, machine A. The stub object unmarshals the return value or exception from the server. This value becomes the return value of the remote method invocation.Or, if the remote method threw an exception,the stub (object) rethrows it in the process space of the caller.  Example Let's assume there is a remote object belongingto the class Product offering the method getDescription(),whose return value is a String object. Let's further assume this method is invoked by a remote machine (notvery surprising). The followingfigure shows what is going on in order to handle this situation,on client
  • 5. side as well as on server side.
  • 6. UNDERSTANDING STUB AND SKELETON RMI uses stub and skeleton objectfor communication with the remote object. A remote object is an object whose method can be invoked from anotherJVM. Let's understand the stub and skeleton objects: Stub The stub is an object, acts as a gatewayfor the client side. All the outgoingrequests 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 followingtasks: 1. It initiates a connection with remote Virtual Machine (JVM), 2. It writes and transmits (marshals)the parameters to the remote Virtual Machine (JVM), 3. It waits for the result 4. It reads (unmarshals)the return value or exception,and 5. It finally, returns the value to the caller. Skeleton The skeleton is an object,acts as a gatewayfor the server side object. All the incomingrequests are routed through it. When the skeleton receives the incomingrequest,it does the followingtasks: 1. It reads the parameterfor the remote method 2. It invokes the method on the actual remote object, and 3. It writes and transmits (marshals)the result to the caller.
  • 7. Steps to write the RMI program This is given the 6 steps to write the RMI program. 1. Create the remote interface 2. Provide the implementation of the remote interface 3. Compile the implementationclass and create the stub and skeleton objects usingthe rmic tool 4. Start the registry service by rmi registry tool 5. Create and start the remote application 6. Create and start the client application Writing RMI services Writing your own RMI services can be a little difficult at first, so we'll start off with an example which isn't too ambitious.We'll create a service that can calculate the square of a number,and the powerof two numbers (238 for example).Due to the large size of the numbers, we'll use the java.math.BigIntegerclass for returningvalues rather than an integeror along.
  • 8. Writing an interface The first thing we need to do is to agree upon an interface, An interface is a description of the methods we will allow remote clients to invoke.Let's considerexactly what we'll need. 1. A method that accepts as a parameteran integer, squares it, and returns a BigInteger public BigIntegersquare ( int number_to_square ); 2. A method that accepts as a parametertwo integers, calculates their power, and returns a BigInteger public BigIntegerpower( int num1,int num2 ); Once we've decided on the methods that will compose ourservice, we have to create a Java interface. An interface is a method which contains abstract methods;these methods mustbe implemented by anotherclass. Here's the source code for our service that calculates powers. import java.math.BigInteger; import java.rmi.*; // // PowerService Interface // // Interface for a RMI service that calculates powers // public interface PowerService extends java.rmi.Remote { // Calculate the square of a number public BigIntegersquare ( int number) throws RemoteException; // Calculate the power of a number public BigIntegerpower ( int num1, int num2) throws RemoteException; } Our interface extends java.rmi.Remote,which indicates that this is a remote service. We provide method definitions for our two methods (square and power),and the interface is complete.The next step is to
  • 9. implementthe interface, and provide methods for the square and powerfunctions. Implementing the interface Implementingthe interface is a little more tricky - we actually have to write the square and powermethods! Don'tworry if you're not sure how to calculate squares and powers,this isn't a math lesson.The real code we need to be concerned aboutis the constructor and main method. We have to declare a defaultconstructor, even when we don't have any initialization code for our service. This is because ourdefault constructor can throw a java.rmi.RemoteException,from its parent constructor in UnicastRemoteObject.Sound confusing?Don'tworry, because ourconstructor is extremelysimple. public PowerServiceServer() throws RemoteException { super(); } Our implementation of the service also needs to have a main method. The main method will be responsiblefor creating an instance of our PowerServiceServer,and registering (or binding)the service with the RMI Registry. Our main method will also assign a security manager to the JVM, to preventany nasty surprises from remotelyloaded classes.In this case, a security managerisn't really needed,but in more complexsystems where untrusted clients will be usingthe service, it is critical.
  • 10. public static void main ( String args[] ) throws Exception { // Assign a security manager,in the eventthat dynamic // classes are loaded if (System.getSecurityManager()== null) System.setSecurityManager( new RMISecurityManager()); // Create an instance of our powerservice server ... PowerServiceServersvr = new PowerServiceServer(); // ... and bind it with the RMI Registry Naming.bind ("PowerService",svr); System.out.println ("Service bound...."); } Once the square and power methods are added, our server is complete.Here's the full source code for the PowerServiceServer. import java.math.*; import java.rmi.*; import java.rmi.server.*; // // PowerServiceServer // // Server for a RMI service that calculates powers // public class PowerServiceServer extends UnicastRemoteObject implements PowerService { public PowerServiceServer() throws RemoteException { super(); } // Calculate the square of a number public BigIntegersquare ( int number) throws RemoteException
  • 11. { String numrep = String.valueOf(number); BigIntegerbi = new BigInteger(numrep); // Square the number bi.multiply(bi); return (bi); } // Calculate the powerof a number public BigIntegerpower( int num1,int num2) throws RemoteException { String numrep = String.valueOf(num1); BigIntegerbi = new BigInteger(numrep); bi = bi.pow(num2); return bi; } public static void main ( String args[] ) throws Exception { // Assign a security manager,in the eventthat dynamic // classes are loaded if (System.getSecurityManager()== null) System.setSecurityManager( new RMISecurityManager()); // Create an instance of our power service server ... PowerServiceServersvr = new PowerServiceServer(); // ... and bind it with the RMI Registry Naming.bind ("PowerService",svr); System.out.println ("Service bound...."); } }
  • 12. Writing a RMI client What good is a service, if you don't write a client that uses it? Writing clients is the easypart - all a client has to do is call the registry to obtain a reference to the remote object,and call its methods.All the underlyingnetworkcommunicationis hidden from view, which makes RMI clients simple. Our client must first assign a security manager,and then obtain a reference to the service. Note that the client receives an instance of the interface we defined earlier,and not the actual implementation. Some behind-the-scenes workis going on, but this is completely transparentto the client. // Assign security manager if (System.getSecurityManager()== null) { System.setSecurityManager (new RMISecurityManager()); } // Call registry for PowerService PowerService service = (PowerService)Naming.lookup ("rmi://" + args[0] + "/PowerService"); To identify a service, we specify an RMI URL. The URL contains the hostname on which the service is located, and the logical name of the service. This returns a PowerService instance,which can then be used just like a local object reference.We can call the methods justas if we'd created an instance of the remote PowerServiceServer ourselves. // Call remote method System.out.println ("Answer: " + service.square(value)); // Call remote method System.out.println ("Answer : " + service.power(value,power)); Writing RMI clients is the easiestpart of buildingdistributed services. In fact, there's more code for the user interface menu in the client than there is for the RMI components! To keep things simple, there's no data validation,so be careful when enteringnumbers. Here's the full source code for the RMI client.
  • 13. import java.rmi.*; import java.rmi.Naming; import java.io.*; // // // PowerServiceClient // // public class PowerServiceClient { public static void main(Stringargs[]) throws Exception { // Checkfor hostname argument if (args.length != 1) { System.out.println ("Syntax - PowerServiceClient host"); System.exit(1); } // Assign security manager if (System.getSecurityManager()== null) { System.setSecurityManager (new RMISecurityManager()); } // Call registry for PowerService PowerService service = (PowerService)Naming.lookup ("rmi://" + args[0] + "/PowerService"); DataInputStream din = new DataInputStream (System.in); for (;;) { System.out.println ("1 - Calculate square"); System.out.println ("2 - Calculate power");
  • 14. System.out.println ("3 - Exit"); System.out.println(); System.out.print("Choice : "); String line = din.readLine(); Integerchoice = new Integer(line); int value = choice.intValue(); switch (value) { case 1: System.out.print("Number : "); line = din.readLine();System.out.println(); choice = new Integer (line); value = choice.intValue(); // Call remote method System.out.println ("Answer : " + service.square(value)); break; case 2: System.out.print("Number : "); line = din.readLine(); choice = new Integer (line); value = choice.intValue(); System.out.print("Power : "); line = din.readLine(); choice = new Integer (line); int power = choice.intValue(); // Call remote method System.out.println ("Answer: " + service.power(value,power)); break; case 3: System.exit(0); default:
  • 15. System.out.println ("Invalid option"); break; } } } } Running the client and server Our example was extremelysimple.More complex systems,however, might contain interfaces that change, or whose implementation changes.To run this article's examples,both the client and server will have a copy of the classfiles,but more advanced systems might share the code of the server on a webserver,for downloadingas required.If your systems do this, don't forget to set the system propertyjava.rmi.server.codebaseto the webserverdirectory in which your classes are stored! You can download all the source and class files togetheras a single ZIP file. Unpack the files into a directory, and then perform the followingsteps. 1. Start the rmiregistry To start the registry, Windows users should do the following (assumingthat your javabin directoryis in the current path):- start rmiregistry To start the registry, Unix users should do the following:- rmiregistry & 2. Compile the server Compile the server, and use the rmic tool to create stub files. 3. Start the server
  • 16. From the directory in which the classes are located, type the following:- java PowerServiceServer 4. Start the client You can run the client locally, or from a different machine.In either case, you'll need to specify the hostnameof the machine where you are runningthe server. If you're runningit locally, use localhostas the hostname. java PowerServiceClientlocalhost TIP - If you runningthe client or server with JDK1.2, then you'll need to change the security settings.You'll need to specify a security policy file (a sample is included with the source code and classes) when you run the client and server. The followingchanges should be made when running the server java -Djava.security.policy=java.policy PowerServiceServer The followingchanges should be made when running the client java -Djava.security.policy=java.policy PowerServiceClientlocalhost