Pankaj Kumar
Pankaj Kumar

Reputation: 255

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

Upvotes: 3

Views: 8274

Answers (1)

tuxdna
tuxdna

Reputation: 8487

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);

    }
}

Upvotes: 5

Related Questions