Simple Java Network Transparency
Thursday, November 2nd, 2006Warning: file_get_contents(http://jug.in.ntu-kpi.kiev.ua/glossary/get) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/www/htdocs/blog/wp-content/plugins/jug-glossary.php on line 40
A short example of how to provide, and use ordinary Java objects across the network, without modification. No XML, no annotations: simply powerful network distributed applications that everyone can immediately understand, and use
Сегодня мы будем обращатся к удаленному объекту физически расположенном на другой тачке, так как будто бы он находится в одной и той же JVM.
Этот пример показывает как использовать класс TransparentItemProxy из проекта cajo. Хм, хотя название у проекта cajo довольно странное название, сделать эту мутку с помощью класса TransparentItemProxy довольно легко, никаких тебе WSDL…
Сначала сделаем интерфейс общий для сервера и клиента. Вообще говоря, можем наклепать сколько угодно интерфейсов даже для одного и того же класса.
Duck.java
public interface Duck {
boolean looks();
boolean walks();
boolean talks();
Duck getDuck();
}
Теперь сделаем простой POJO сервер, реализующий интерфейс, который нужно будет удаленно вызывать.
DuckServer.java
import java.io.Serializable;
import gnu.cajo.invoke.Remote;
import gnu.cajo.utils.ItemServer;
import gnu.cajo.utils.CodebaseServer;public class DuckServer implements Duck, Serializable {
public boolean looks() {
System.out.println(”hi there!”);
return true;
}public boolean walks() {
System.out.println(”waddle waddle”);
return true;
}public boolean talks() {
System.out.println(”quack quack!”);
return true;
}public Duck getDuck() {
return new DuckServer();
}public static void main(String args[]) { // simple unit test
try {
Remote.config(null, 1198, null, 0); // use cajo port 1198
new CodebaseServer(null, 0);
ItemServer.bind(new DuckServer(), “Donald”);
System.out.println(”duck server running”);
} catch(Exception x) {
x.printStackTrace();}
}
}
Компилируем удаленный интерфейс Duck и сервер его реализующий, для этого нужна либа https://cajo.dev.java.net/cajo.jar
Компилируем
javac -classpath . Duck.java
javac -classpath cajo.jar;. DuckServer.java
Запускаем сервер
java -classpath cajo.jar;. DuckServer
Отлично. Теперь быстро напишем клиента, который будет общатся с сервером.
DuckClient.java
import gnu.cajo.invoke.NoSecurityManager;
import gnu.cajo.utils.extra.TransparentItemProxy;public class DuckClient { // try out DuckServer
public static void main(String args[]) {
try {
System.setSecurityManager(new NoSecurityManager());
Duck duck = (Duck)TransparentItemProxy.getItem(
“//serverHost:1198/Donald”,
new Class[] { Duck.class }
);duck = duck.getDuck(); // by value
System.out.println(”looks like = ” + duck.looks());
System.out.println(”walks like = ” + duck.walks());
System.out.println(”talks like = ” + duck.talks());} catch(Exception x) {
x.printStackTrace();
}
}
}
Примечание: замените localhost на имя хоста с запущенным сервером.
Компилируем и запускаем клиент
javac -classpath cajo.jar;. DuckClient.java
java -classpath cajo.jar;. DuckClient
У клиента в консоли будет
looks like = true
walks like = true
talks like = true
а в консоли сервера
hi there!
waddle waddle
quack quack!
Получается, что клиент использует серверный объект так, как будто бы тот был создан пару строчками выше.
В этом примере использовался вызов удаленного объекта по ссылке, вы можете посмотреть пример использования удаленного объекта по значению.