Esercizio 4: Mobilita' di Codice -- Caricamento del codice Client attraverso codebase da una macchina Server. 


Vediamo tre possibili esercizi in conformita' con quanto studiato nel capitolo 9.10. Chiaramente dovete sostituire i miei dati con i vostri.

Si crei dentro javarmi un package mobility:

1) Bootstrap via RMIClassloader. 

In tal caso cio' che bisogna fare e' piazzare la classe Client.class che si vuole caricare presso un URL sulla macchina server, accessibile dalla macchina Client.

a)Si metta il seguente codice Client.java:

package mobility;

import java.io.*;

public class Client implements Runnable, Serializable
{
    public void    run()
    {
        System.out.println("Io sono il Client caricato dinamicamente");
    }
}

in un area comune, ad esempio dentro ~/public_html/myclasses/mobility (come al solito creaimo un package mobility dentro l'area comune).

b) Si compili tale classe.

c) Nella macchina client si metta dentro la directory javarmi/mobility/ il codice del Client che si preoccupa di caricare dianmicamente la sua classe,
chiamato URLClientBootstrap.java:

package mobility;

import java.io.*;
import java.net.*;
import java.rmi.server.*;

public class URLClientBootstrap
{
 static final String codebase = "http://profs.sci.univr.it/~merro/myclasses/"; //mettete l'indirizzo della vostra area comune, senza il package.
 static final String clientClass = "mobility.Client";

 public static void main(String[] args) throws Exception
 {
  System.setSecurityManager(new SecurityManager());
  Class cl = RMIClassLoader.loadClass(codebase,clientClass);
  Runnable client = (Runnable)cl.newInstance();
  client.run();
 }
}

d) Compilate il codice sopra indicato e lanciatelo dalla macchina client preoccupandovi di aggiungere nella directory javarmi/mobility/ della macchina Client
     il file di policy visto che caricate dinamicamente del codice, cioe' quello della classe Client.class.

e) Lanciate il codice URLClientBootstrap dalla macchina client.


2) Bootstrapping attraverso RMI

In questa soluzione il Server crea un oggetto di tipo Client e lo passa come risultato di un'invocazione remoto di un metodo di un oggetto
remoto che viene registrato normalmente nel registro RMI. Come sappiamo l'oggetto che verra passato deve essere Serializzabile, ed infatti la classe
Client e' definita serializzabile. Il Client, dal canto suo fara' una lookup per ottenere lo stub all'oggetto remoto in modo da invocare il metodo
remoto getClient() per ottenere un oggetto di tipo client che verra' lanciato dalla sua macchina. Chiaramente dovete sostituire i miei dati con i vostri.


a) Nella macchina server si crea dentro javarmi/mobility/ si mette l'interfaccia del server Bootstrap.java:

package mobility;

import java.io.*;
import java.net.*;
import java.rmi.*;
import java.rmi.server.*;

public interface Bootstrap extends Remote  \\ ERRATA CORRIGE
{
    Runnable    getClient() throws RemoteException;
}

b) Si mette poi il codice del server,

package mobility;

import java.io.*;
import java.net.*;
import java.rmi.*;
import java.rmi.server.*;


class BootstrapServer extends UnicastRemoteObject implements Bootstrap
{
    public BootstrapServer() throws RemoteException    {}

    public Runnable    getClient()    { return new Client();    }

    public static void    main(String[] args) throws Exception
    {
        Bootstrap    server = new BootstrapServer();
        Naming.rebind(Bootserver,server);
        System.out.println("Bootstrap server running");
    }
}

c) Si aggiunge anche in javarmi/mobility/ il codice Client.java sopra indicato.
 
d) Si va in javarmi/mobilit/ e si compila il codice mettendo le classi nell'area comune:
 
         javac -d ~/public_html/myclasses/ Bootstrap.java Client.java BootstrapServer.java

e) Si fa la compilazione rmic in javarmi con

          rmic -d ~/public_html/myclasses/ mobility.BootstrapServer

     
e) Si lancia il registro RMI (corrrettamente) alla porta standard.

f) Si lancia il server dalla directory javarmi , ad esempio col seguente comando

java -classpath /home/massimo/public_html/myclasses/
          -Djava.rmi.server.codebase=http://profs.sci.univr.it/~merro/myclasses/
          -Djava.rmi.server.hostname=profs.sci.univr.it
           mobility.BootstrapServer

 
g) Se tutto e' ok, vi spunta una riga che dice:

"Bootstrap server running"


h) Nel client nella directory javarmi/mobililty/ si mette il file di policy, l'interfacci Bootstrap.java e RMIClientBootstrap.java con il seguente codice:
package mobility;

import java.io.*;
import java.net.*;
import java.rmi.*;
import java.rmi.server.*;

public class RMIClientBootstrap
{
    static final String    bootstrapServer = "rmi://profs.sci.univr.it/BootServer";

    public static void    main(String[] args) throws Exception
    {
        System.setSecurityManager(new SecurityManager());
                System.out.println("Prima della lookup");
         try
         {
        Bootstrap  bootstrap = (Bootstrap)Naming.lookup("//profs.sci.univr.it/BootServer");
        System.out.println("Dopo della lookup");
        Runnable    client = bootstrap.getClient();
        System.out.println("Invocazione metodo remoto");
        client.run();
    }
       catch (RemoteException e)
  {
   System.err.println(e);
  }
}
}

i) compilate il cliente in javarmi/mobility/ con

    javac Bootstrap.java RMIClientBootstrap.java

l) Lanciate il Client da javarmi non dimenticando la clausola di policy.