cajo
client server communication example
The Server.java
import gnu.cajo.Cajo; // The cajo implementation of the Grail
public class Server {
public static class Test { // remotely callable classes must be public
// though not necessarily declared in the same class
private final String greeting;
// no silly requirement to have no-arg constructors
public Test(String greeting) { this.greeting = greeting; }
// all public methods, instance or static, will be remotely callable
public String foo(Object bar, int count) {
System.out.println("foo called w/ " + bar + ' ' + count + " count");
return greeting;
}
public Boolean bar(int count) {
System.out.println("bar called w/ " + count + " count");
return Boolean.TRUE;
}
public boolean baz() {
System.out.println("baz called");
return true;
}
public String other() { // functionality not needed by the test client
return "This is extra stuff";
}
} // arguments and return objects can be custom or common to server and client
public static void main(String args[]) throws Exception { // unit test
Cajo cajo = new Cajo(0);
System.out.println("Server running");
cajo.export(new Test("Thanks"));
}
}
Compile via:
javac -cp cajo.jar;. Server.java
Execute via:
java -cp cajo.jar;. Server
As you can see with just 2 commands :
Cajo cajo = new Cajo(0);
cajo.export(new Test("Thanks"));
we can expose any POJO (Plain Old Java Object) as a distributed service!
And now the Client.java
import gnu.cajo.Cajo;
import java.rmi.RemoteException; // caused by network related errors
interface SuperSet { // client method sets need not be public
void baz() throws RemoteException;
} // declaring RemoteException is optional, but a nice reminder
interface ClientSet extends SuperSet {
boolean bar(Integer quantum) throws RemoteException;
Object foo(String barbaz, int foobar) throws RemoteException;
} // the order of the client method set does not matter
public class Client {
public static void main(String args[]) throws Exception { // unit test
Cajo cajo = new Cajo(0);
if (args.length > 0) { // either approach must work...
int port = args.length > 1 ? Integer.parseInt(args[1]) : 1198;
cajo.register(args[0], port);
// find server by registry address & port, or...
} else Thread.currentThread().sleep(100); // allow some discovery time
Object refs[] = cajo.lookup(ClientSet.class);
if (refs.length > 0) { // compatible server objects found
System.out.println("Found " + refs.length);
ClientSet cs = (ClientSet)cajo.proxy(refs[0], ClientSet.class);
cs.baz();
System.out.println(cs.bar(new Integer(77)));
System.out.println(cs.foo(null, 99));
} else System.out.println("No server objects found");
System.exit(0); // nothing else left to do, so we can shut down
}
}
Compile via:
javac -cp cajo.jar;. Client.java
Execute via:
java -cp cajo.jar;. Client
Related Article:
