Simple Java Network Transparency


Warning: 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!

Получается, что клиент использует серверный объект так, как будто бы тот был создан пару строчками выше.

В этом примере использовался вызов удаленного объекта по ссылке, вы можете посмотреть пример использования удаленного объекта по значению.

Leave a Reply

You must be logged in to post a comment.