Java has a Remote Method Invocation mechanism.
// RMIExample.java // Interface for the RMI remote object. // Note: Interface must extend from java.rmi.Remote // Methods must throw RemoteExcpetion import java.rmi.*; public interface RMIExample extends Remote { public boolean PostMsg(String strMsg) throws RemoteException; public long Factorial(long lVal) throws RemoteException; }
Note: the class Remote doesn't have any methods so none have to be implemented.
This code implements the remote object.
// RMIExampleImpl.java // Implements the remote object // Note: The object must extend from UnicastRemoteObject // The object must implement the associated interface import java.rmi.*; import java.rmi.server.UnicastRemoteObject; import java.io.*; public class RMIExampleImpl extends UnicastRemoteObject implements RMIExample { protected static String m_strName; public RMIExampleImpl() throws RemoteException { super(); // call base class constructor } public boolean PostMsg(String strMsg) throws RemoteException { System.out.println("Server: PostMsg() invoked..."); System.out.println("Server: Message > " + strMsg); return true; } public long Factorial(long lVal) throws RemoteException { long lRes = FactorialEx(lVal); System.out.println("Server: Factorial() invoked..."); System.out.println("Server: Factorial("+lVal+") = " + lRes); return lRes; } protected long FactorialEx(long lVal) { if (lVal <= 1) return 1; else return lVal * FactorialEx(lVal-1); } public static void main(String argv[]) { try { m_strName = "TheRMIExample"; System.out.println("Server: Registering RMIExampleImpl as \"" + m_strName +"\""); RMIExampleImpl Example = new RMIExampleImpl(); Naming.rebind(m_strName, Example); System.out.println("Server: Ready..."); } catch (Exception e) { System.out.println("Server: Failed to register RMIExampleImpl: " + e); } } }
// RMIClient.java // // This sample Java RMI client can perform the // following operations: // (1) Send a message to a remote object. This // is done by using the -m command line switch. // Example: java RMIClient -m "My message in quotes" // (2) Calculate the factorial of a given number via // a method of the remote object. // Example: java RMIClient -f 5 import java.rmi.*; import java.rmi.server.*; public class RMIClient { public static void main(String argv[]) { // Validate command line parameters if (argv.length < 2) { System.out.println("Usage: java RMIClient [-m \"MESSAGE\"] [-f INTEGER]"); System.exit(1); } // Command line option flags boolean bMessage = false; boolean bFactorial = false; String strMsg = "No message."; long lVal = 1; // Determine data to be processed for (int i=0; i<argv.length; i++) { if (argv[i].equals("-m")) { bMessage = true; strMsg = argv[++i]; } if (argv[i].equals("-f")) { bFactorial = true; lVal = Long.parseLong(argv[++i]); } } // Install security manager. This is only necessary // if the remote object's client stub does not reside // on the client machine (it resides on the server). System.setSecurityManager(new RMISecurityManager()); // Get a remote reference to the RMIExampleImpl class String strName = "rmi://wpi.wpi.edu/TheRMIExample"; System.out.println("Client: Looking up " + strName + "..."); RMIExample RemRMIExample = null; try { RemRMIExample = (RMIExample)Naming.lookup(strName); } catch (Exception e) { System.out.println("Client: Exception thrown looking up " + strName); System.exit(1); } // Send a messge to the remote object if (bMessage) { try { if (!RemRMIExample.PostMsg(strMsg)) System.out.println("Client: Remote PostMsg() call failed."); } catch (Exception e) { System.out.println("Client: Exception thrown calling PostMsg()."); System.exit(1); } } // Calculate the factorial if (bFactorial) { try { long lRes = RemRMIExample.Factorial(lVal); System.out.println("Client: Factorial(" + lVal + ") = " + lRes); } catch (Exception e) { System.out.println("Client: Excpetion thrown calling Factorial()."); System.exit(1); } } } }
RMIExampleImplStubs: RMIExampleImpl rmic RMIExampleImpl RMIExampleImpl: RMIExample RMIClient javac RMIExampleImpl.java RMIExample: RMIExample.java javac RMIExample.java RMIClient: RMIClient.java javac RMIClient.java clean: rm RMIClient.class RMIExample.class RMIExampleImpl.class RMIExampleImpl_Skel.class RMIExampleImpl_Stub.class
< 1 >ls Makefile RMIExample.java java.policy RMIClient.java RMIExampleImpl.script < 2 >make javac RMIExample.java javac RMIClient.java javac RMIExampleImpl.java rmic RMIExampleImpl < 3 >rmiregistry& [1] 70 < 4 >ls Makefile RMIExampleImpl.class RMIClient.class RMIExampleImpl.java RMIClient.java RMIExampleImpl_Skel.class RMIExample.class RMIExampleImpl_Stub.class RMIExample.java java.policy < 5 >java RMIExampleImpl& [2] 19426 Server: Registering RMIExampleImpl as "TheRMIExample" Server: Ready... < 6 > java RMIClient -m "How is the weather over there?" Client: Looking up rmi://..edu/TheRMIExample... Client: Exception thrown looking up rmi://..edu/TheRMIExample < 8 >java -Djava.security.policy=java.policy RMIClient -m "hello from the client" Client: Looking up rmi://..edu/TheRMIExample... Server: PostMsg() invoked... Server: Message > hello from the client < 9 >java -Djava.security.policy=java.policy RMIClient -f 5 Client: Looking up rmi://..edu/TheRMIExample... Server: Factorial() invoked... Server: Factorial(5) = 120 Client: Factorial(5) = 120 < 10 >jobs [1] + Running rmiregistry [2] - Running java RMIExampleImpl < 11 >kill %1 %2 < 12 > [1] Terminated rmiregistry < 13 > [2] Terminated java RMIExampleImpl
rmiregistry &
(remember
to kill -9 the process when your done using it)