# Java Programming/RMI-IIOP

* Navigate Concurrent Programming topic: ( v • d • e )
* Threads and Runnables
* Basic Synchronization
* Client Server Programming
* Remote Method Invocation (RMI)
* Enterprise JavaBean Programming (EJB)
* Java Spaces Programming (Jini)
RMI-IIOP (RMI over IIOP) is provided with the Java SDK. It combines Remote Method Invocation (RMI) technology with the Internet Inter-Orb Protocol (IIOP) to provide CORBA to the Java platform. Java developers do not have to provide IDL in order to provide CORBA capabilities.

### The Remote Interface

* Code listing 7.1: HowdyInterface.java
* import java.rmi.Remote;
* public interface HowdyInterface extends java.rmi.Remote {
* public void sayHowdy throws RemoteException;
The above code defines a remote interface called HowdyInterface that will define what the remote client may call on the server. All of the operations must throw a RemoteException. The interface must extend java.rmi.Remote.

## The Implementation Class

* Code listing 7.2: HowdyImpl.java
* import javax.rmi.PortableRemoteObject;
* import javax.rmi.RemoteException;
* public class HowdyImpl implements HowdyInterface {
* public HelloImpl throws java.rmi.RemoteException {
* PortableRemoteObject.exportObject(this); // Initializes the remote object
* public void sayHowdy throws RemoteException {
* System.out.println("Weeee doggies! Howdy!!");
The implementation class allows for the object to be ORB-initialized. It also implements the remote operation to be called. The implementation could have extended PortableRemoteObject, in which case the exportObject call in the constructor would be removed. The better approach would seem to be as coded above.

## The Server Class

* Code listing 7.3: HowdyServer.java
* import javax.naming.InitialContext;
* import javax.naming.Context;
* import javax.rmi.PortableRemoteObject ;
* import com.sun.corba.se.internal.POA.POAORB;
* import org.omg.PortableServer.*;
* import java.util.*;
* import org.omg.CORBA.*;
* import javax.rmi.CORBA.Stub;
* import javax.rmi.CORBA.Util;
* public class HowdyServer {
* public HowdyServer(String args) {
* try {
* Properties p = System.getProperties;
* // add runtime properties here
* p.put("org.omg.CORBA.ORBClass",
* "com.sun.corba.se.internal.POA.POAORB");
* p.put("org.omg.CORBA.ORBSingletonClass",
* "com.sun.corba.se.internal.corba.ORBSingleton");
* ORB orb = ORB.init( args, p );
* POA rootPOA = (POA)orb.resolve_initial_references("RootPOA");
* Policy tpolicy = new Policy[3];
* tpolicy[0] = rootPOA.create_lifespan_policy(
* LifespanPolicyValue.TRANSIENT );
* tpolicy[1] = rootPOA.create_request_processing_policy(
* RequestProcessingPolicyValue.USE_ACTIVE_OBJECT_MAP_ONLY );
* tpolicy[2] = rootPOA.create_servant_retention_policy(
* ServantRetentionPolicyValue.RETAIN);
* POA tPOA = rootPOA.create_POA("MyTransientPOA", null, tpolicy);
* tPOA.the_POAManager.activate;
* HowdyImpl howdyImpl = new HowdyImpl;
* _HowdyImpl_Tie tie = (_HowdyImpl_Tie)Util.getTie( howdyImpl );
* String howdyId = "howdy";
* byte id = howdyId.getBytes;
* tPOA.activate_object_with_id( id, tie );
* Context initialNamingContext = new InitialContext;
* initialNamingContext.rebind("HowdyService",
* tPOA.create_reference_with_id(id,
* tie._all_interfaces(tPOA,id)[0]) );
* System.out.println("Howdy Server: Ready...");
* orb.run;
* catch (Exception e) {
* System.out.println("Error running HowdyServer: " + e);
* e.printStackTrace;
* public static void main(String args) {
* new HowdyServer( args );

## The Client Class

* Code listing 7.4: HelloClient.java
* import java.rmi.RemoteException;
* import java.net.MalformedURLException;
* import java.rmi.NotBoundException;
* import javax.rmi.*;
* import java.util.Vector;
* import javax.naming.NamingException;
* import javax.naming.InitialContext;
* import javax.naming.Context;
* public class HelloClient {
* public static void main( String args ) {
* Context ic;
* Object objref;
* HelloInterface hi;
* try {
* ic = new InitialContext;
* } catch (NamingException e) {
* System.out.println("failed to obtain context" + e);
* e.printStackTrace;
* return;
* try {
* objref = ic.lookup("HowdyService");
* System.out.println("Client: Obtained a reference to Howdy server.");
* } catch (NamingException e) {
* System.out.println("failed to lookup object reference");
* e.printStackTrace;
* return;
* try {
* hi = (HowdyInterface) PortableRemoteObject.narrow(
* objref, HowdyInterface.class);
* hi.sayHowdy;
* } catch (ClassCastException e) {
* System.out.println("narrow failed");
* e.printStackTrace;
* return;
* } catch( Exception e ) {
* System.err.println( "Exception " + e + "Caught" );
* e.printStackTrace( );
* return;
The client code uses the name service to look up the server and make the remote invocation.