Java RMI - A Complete Example
In this example, City
can be replaced by any similar model class, such as Car
or Person
.
Package Directory
.
├── client
│ ├── CityAddedCallbackImpl.java
│ └── ClientRunnable.java
├── interfaces
│ ├── City.java
│ ├── CityAddedCallback.java
│ └── CityPool.java
└── server
├── CityImpl.java
├── CityPoolImpl.java
└── ServerRunnable.java
Interfaces Shared by Client & Server
Model
public interface City extends Remote{
String getName() throws RemoteException;
int getPopulation() throws RemoteException;
int getTemperature() throws RemoteException;
}
Callback
public interface CityAddedCallback extends Remote {
void cityAdded(City city) throws RemoteException;
}
Model Pool
public interface CityPool extends Remote{
void create(String name, int population, int temperature) throws RemoteException;
City lookup(String name) throws RemoteException;
void register(CityAddedCallback cityAddedCallback) throws RemoteException;
void deregister(CityAddedCallback cityAddedCallback) throws RemoteException;
}
Client
Callback Implementation
public class CityAddedCallbackImpl extends UnicastRemoteObject implements CityAddedCallback {
protected CityAddedCallbackImpl() throws RemoteException {
super();
}
public void cityAdded(City city) {
System.out.println(city);
}
}
Runnable
public class ClientRunnable implements Runnable{
public void run() {
try{
CityPool cityPool = (CityPool) Naming.lookup("//host/CityPool");
CityAddedCallback cityAddedCallback = new CityAddedCallbackImpl();
cityPool.register(cityAddedCallback);
cityPool.create("city1", 10, 30);
City city = cityPool.lookup("city1");
System.out.println(city.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Server
Model Implementation
public class CityImpl extends UnicastRemoteObject implements City {
private String name;
private int population;
private int temperature;
public CityImpl(String name, int population, int temperature) throws RemoteException {
super();
this.name = name;
this.population = population;
this.temperature = temperature;
}
public String getName() throws RemoteException {
return name;
}
public int getPopulation() throws RemoteException {
return population;
}
public int getTemperature() throws RemoteException {
return temperature;
}
}
Model Pool Implementation
public class CityPoolImpl extends UnicastRemoteObject implements CityPool {
private List<City> cities;
private List<CityAddedCallback> cityAddedCallbacks;
public CityPoolImpl() throws RemoteException {
super();
this.cities = new ArrayList<>();
}
public void create(String name, int population, int temperature) throws RemoteException {
}
public City lookup(String name) throws RemoteException {
return null;
}
public void register(CityAddedCallback cityAddedCallback) throws RemoteException {
}
public void deregister(CityAddedCallback cityAddedCallback) throws RemoteException {
}
}
Runnable
public class ServerRunnable implements Runnable{
public void run() {
try{
CityPool cityPool = new CityPoolImpl();
Naming.rebind("CityPool", cityPool);
} catch (Exception e) {
e.printStackTrace();
}
}
}