Pankaj Kumar Pankaj Kumar - 1 month ago 7
Java Question

Example of a rmi program involving 2 machine connected via LAN

I am trying to learn concepts of rmi in java. I succesfully run it in my machine and tried out to do it on two machine but failed.
Server.java has

System.setSecurityManager(new RMISecurityManager());
Addition Hello = new Addition();
Registry registry = LocateRegistry.createRegistry(5432);
//Addition stub = (Addition) UnicastRemoteObject.exportObject(Hello,6789);
registry.rebind("lookupthis", Hello);
System.out.println("Addition Server is ready.");


Client.java has

Registry reg=LocateRegistry.getRegistry("[ip of server]",5432);
hello = (AdditionalInterface)Naming.lookup("lookupthis");
int result=hello.Add(9,10);
System.out.println("Result is :"+result);


What changes i have to make it work for two machines.

Please help me with this, Thanks in Advance

Answer Source

Instead of "localhost" use "0.0.0.0" in RMI host of the RMI Server.

EDIT1

Here are another set of changes:

  • Create a registry at the port where you want your server to listen to LocateRegistry.createRegistry(port)
  • Your RMI class Addition should be Serializable ( achieved via UnicastRemoteObject )
  • The RMI methods should throw RemoteException in their signature.
  • The RMI client should know the name/port of the remote machine ( in this case box01 / 1091 ).

Also note that the port you chose should not be already occupied by any other service. Such as port 1099.

Below is the code that works:

AdditionalInterface.java

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface AdditionalInterface extends Remote {
    public int Add(int a, int b) throws RemoteException;
}

Addition.java

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Addition extends UnicastRemoteObject implements
        AdditionalInterface {
    private static final long serialVersionUID = 1L;

    public Addition() throws RemoteException {
        // TODO Auto-generated constructor stub
    }

    public int Add(int a, int b) {
        return a + b;
    }
}

AdditionServer.java

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class AdditionServer {
    public static void main(String[] argv) throws RemoteException {
        Addition Hello = new Addition();

        int port = 1091;

        try { // special exception handler for registry creation
            LocateRegistry.createRegistry(port);
            System.out.println("java RMI registry created.");
        } catch (RemoteException e) {
            // do nothing, error means registry already exists
            System.out.println("java RMI registry already exists.");
        }

        String hostname = "0.0.0.0";

        String bindLocation = "//" + hostname + ":" + port + "/Hello";
        try {
            Naming.bind(bindLocation, Hello);
            System.out.println("Addition Server is ready at:" + bindLocation);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("Addition Serverfailed: " + e);
        }
    }
}

AdditionClient

import java.net.MalformedURLException;
import java.rmi.*;

public class AdditionClient {
    public static void main(String[] args) {
        String remoteHostName = "box01";
        int remotePort = 1091;
        String connectLocation = "//" + remoteHostName + ":" + remotePort
                + "/Hello";

        AdditionalInterface hello = null;
        try {
            System.out.println("Connecting to client at : " + connectLocation);
            hello = (AdditionalInterface) Naming.lookup(connectLocation);
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (RemoteException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (NotBoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        int result = 0;
        try {
            result = hello.Add(9, 10);
        } catch (RemoteException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        System.out.println("Result is :" + result);

    }
}