Java Remote methods

computerharpySoftware and s/w Development

Dec 2, 2013 (3 years and 11 months ago)

89 views

1

Java

Remote Method Invocation

java.rmi.*

java.rmi.registry.*

java.rmi.server.*

2

Local Procedure Calls

#include <...>

int myFunc (stuff)

int main ( )

{


:


:


val = myFunc(stuff)


:

}

int myFunc(stuff)

{


:

}

3

Local Procedure Call Limitations


Function is bound to the executing
program


compiled (or linked) into executable
code


If function is needed again, it is copied


Any function modifications must be
made to all copies


4

Remove LP Limitations


Remove the static relationship between
function and calling program.


Allow function to be dynamically associated
with calling program


Windows dynamically linked library


More general approach is to use Remote
Procedure Calls


Developed in 1980’s

5

Remote Procedure Approach


Allow function call to span processes or even
machines.


Replace (extend) the function call process.


Develop a standard set of rules (interface) that
allows any process to call any function that
follows the interface rules


Automatically build interface files needed to
connect caller to function


Method_Skel.class


Method_Stub.class

6

Remote Procedure Issues


Where is the function?


Addressing procedures


Registration procedures


How do we format the data?


Must be readable by all utilized platforms


Common definitions for data (integers, floats,
etc.)


Common byte order


Common structure

7

Remote Method Invocation


Java to Java approach for distributed
communication and computation


Establishes Method Registry


Uses existing data management
mechanisms to control data flow


Object serialization

8

RMI Benefits


Supports Distributed processing


Function can be located anywhere...


Supports Shared use of functions


All users use same function, get same
responses


Supports Dynamic implementation of
function


Independent of calling program


Within limits (interface remains the same)

9

Serializing Data


Needed when objects must be passed


Serializable objects implement the
serializable

interface


java.io.serializable


Most common objects implement
serializable


Custom objects may need to implement
the serializable interface to allow then to
be transported between client and server

10

Remote Method Process


Define remote method (RM)


Define interface between caller and RM


Make data serializable


Build remote method interface


Build remote method (server)


Build calling program (client)


Compile server, client, and interface


Start server, register service


Run calling program (client)

11

RMI Example


Implement Fahrenheit to centigrade
temperature conversion using a
remote method.


Remote method takes a Fahrenheit
temperature and returns the
equivalent centigrade temperature.

12

Define Remote Method


centigrade = 5*(Fahrenheit
-

32) /9

13

Define Remote Interface


Input:


temperature in Fahrenheit


Return:


temperature in Celsius



Specify both values as integers


computations are rounded


integers are serializable

14

Build RM Interface

import java.rmi.*;


public
interface

iTemp
extends Remote

{


public int
getTemp
( int farTemp)








throws RemoteException
;

}

15

Build Server

import java.rmi.*;

import java.rmi.registry.*;

import java.rmi.server.*;

public class TempConverter extends



UnicastRemoteObject
implements iTemp

{


public TempConverter() throws
RemoteException {}


public int getTemp( int farTemp)



{



return ((int)(5*(farTemp
-
32)/9));


}

16

Build Server


public static void main(String args[])



{



try




{




TempConverter tc = new TempConverter();




String servObjName =
"///TempConverter";




Naming.rebind
(
servObjName, tc);




System.err.println("TempConv is up!");



} catch (Exception e)





{ e.printStackTrace( ); }


}//end of main

}//end of TempConverter



17

Build Client

import java.rmi.*;

import java.io.*;

public class
TempUser


{


public static void main(String args[])


{





DataInputStream dis = new DataInputStream







(System.in);





String sIn;





int nuTemp;




iTemp remoteTemp
;

18

Build Client


try


{




remoteTemp

= (iTemp)
Naming.lookup




("rmi://vudt
-
cotter.cstp.umkc.edu/TempConverter");




System.out.print("Enter temperature(Farenheit) ");




System.out.flush();




sIn = dis.readLine();




nuTemp =
remoteTemp.getTemp
(Integer.parseInt(sIn));




System.out.println("That is "+ nuTemp +






" degrees centigrade");


} catch (Exception e)





{ e.printStackTrace(); }


} //end of main

}// end of TempUser

19

Compile programs


Compile Server


javac

TempConverter.java



Create Remote Method Stubs and clients


rmic

TempConverter



Compile Client


(uses TempConverter_Stub.class)


javac

TempUser.java

20

Register Service / Run Program


Start up RMI registry


rmiregistry



Start up Server


java TempConverter



Start up Client


java TempUser

21

RMI TempConverter Output

Server Side...

D:
\
data
\
cs423
\
java
\
tempRMI>
start rmiregistry


D:
\
data
\
cs423
\
java
\
tempRMI>
java TempConverter

TempConv is up!

^C

D:
\
data
\
cs423
\
java
\
tempRMI>


Client Side
...

D:
\
data
\
cs423
\
java
\
tempRMI>
java TempUser

Enter temperature(Farenheit)

32

That is 0 degrees centigrade


D:
\
data
\
cs423
\
java
\
tempRMI>

22

iMath.java

import java.rmi.*; java.io.*;


public interface iMath extends Remote

{


public int
getSum
( Numbers sum) throws RemoteException;


public int
getProduct
( Numbers product) throws
RemoteException;



public class
Numbers

implements Serializable


{




private int num1;



private int num2;



private int num3;




public Numbers() { }



public void setN1(int num) { num1 = num; }



public void setN2(int num) { num2 = num; }



etc.

23

MathServer.java

import java.rmi.*;import java.rmi.registry.*;import
java.rmi.server.*;

public class
MathServer extends



UnicastRemoteObject implements iMath

{


public
MathServer()

throws RemoteException {}


public int

getSum
( iMath.Numbers sum)

{



int n1, n2, n3;



:



return (nuSum);


}


public int
getProduct
( iMath.Numbers product)
{



int n1,

n2, n3;



:



return (nuProd);


}

24

MathServer.java


public static void main(String args[])


{



try



{




MathServer ms = new MathServer();




String servObjName = "///MathServer";




Naming.rebind(servObjName, ms);




System.err.println("MathServer is up!");



} catch (Exception e){




e.printStackTrace();



}



}

}

25

MathUser.java

import java.rmi.*; import java.io.*;

public class MathUser {


public static void main(String args[]) {



BufferedReader dis= new BufferedReader(new
InputStreamReader(System.in));



String sIn1, sIn2, sIn3;




int add1, add2, add3,answer;



iMath remoteAdder;




iMath.Numbers nums = new iMath.Numbers
();


try {


remoteAdder = (iMath) Naming.lookup
("rmi://134.193.128.56/MathServer");



System.out.print("Enter First number (integers) ");




System.out.flush();



sIn1 = dis.readLine();



System.out.print("Enter Second number (integers) ");




System.out.flush();



sIn2 = dis.readLine();

26

MathUser.java



System.out.print ("Enter Third number (integers) ");


System.out.flush();



sIn3 = dis.readLine();



nums.setN1(Integer.parseInt(sIn1));



nums.setN2(Integer.parseInt(sIn2));



nums.setN3(Integer.parseInt(sIn3));



System.out.print("Do you want the Sum or Product (S or P)?");



sIn1 = dis.readLine();



if (sIn1.equals("S")) {




answer = remoteAdder.getSum(nums
);




System.out.println("That sum is " + answer );






}



else {





answer = remoteAdder.getProduct(nums);




System.out.println("That product is " + answer );



}


} catch (Exception e) { e.printStackTrace(); }


}

}

27

Summary


Java RMI process similar to RPC



RMI Registry acts as Portmapper.
Registry is located on serving host.



RMIC acts as remote method
communications generator (RPCgen)