Example of a rmi program involving 2 machine connected via LAN
java, rmi
Solution
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);
}
}
Problem
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