Esercizio3:   Server Remoti. 


Cercate di  lavorate in maniera distribuita su due macchine. In una mettete il Client ed in un'altra il server. Scegliete macchine contigue in modo che possiate
vedere le reazioni di entrambi i programmi. Come al solito lavoreremo dentro un package che chiameremo'servers" che potrete mettere dentro la vostra directory javarmi.

Esercizio 3.1: 


-  Il server carica l'interfaccia remota RemoteDate.java
package servers;

import java.rmi.*;
import java.rmi.server.*;
import java.util.*;

public interface RemoteDate extends Remote
{
public Date getDate() throws RemoteException;
}

e l'implementazione del server RemoteDateServer.java:
package servers;

import java.rmi.*;
import java.rmi.server.*;
import java.util.*;


class RemoteDateServer extends UnicastRemoteObject implements RemoteDate
{
int count = 1;

RemoteDateServer() throws RemoteException {};


public Date getDate()
{
System.out.println("Il Client ha chiesto l'ora " + count + " volte");

if (count++ == 4)
{
try
{
System.out.println("Ora Basta!!!");
System.out.println("Sto facendo l'unbind dell'oggetto remoto dal Registro RMI");
Naming.unbind("DateServer");
System.out.println("Ho fatto l'unbind dell'oggetto remoto dal Registro RMI");
System.out.println("Caro Client comprati un orologio!!!");
}
catch (Exception e)
{
e.printStackTrace(getLog());
}
};
return new Date();

}


public static void main(String[] args)
{
try
{
RemoteDateServer server = new RemoteDateServer();
Naming.rebind("DateServer",server);
System.out.println("L'oggetto remoto e' in esecuzione e registrato nel registro RMI");

}
catch (Exception e)
{
e.printStackTrace();
}
}
}


Si compilano i sorgenti (javac e rmic),  e si lancia il registro rmi (alla porta di default) e poi si lancia il server (non e' necessario il file di policy).

- Il client carica anche lui l'interfaccia remota, il file di policy (quello abituale), ed il codice RemoteDateClient.java.

package servers; 

import java.rmi.*;
import java.rmi.server.*;
import java.util.*;


class RemoteDateClient
{
static RemoteDate server = null;
public static void main(String[] args)
{
// System.setProperty("java.security.debug","access,failure");
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
try
{
while (true)
{ server = (RemoteDate)Naming.lookup("rmi://"+args[0]+"/DateServer");
System.out.println("Local Date at & Time "+args[0]+" is: "+new Date());
System.out.println("Remote Date at & Time at "+args[0]+" is: "+server.getDate());
int c = System.in.read();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}


Compila il codice, e lo lancia con la clausola per la policy.

Lo studente e' invitato a capire il funzionamento dei sorgenti.


Esercizio 3.2.


Fare il medesimo esercizio in cui RemoteDateClient.java e' rimpiazzato da RemoteDateClient2.java (ovviamente ricompilate, ect...)


package servers; 

import java.rmi.*;
import java.rmi.server.*;
import java.util.*;


class RemoteDateClient2
{
static RemoteDate server = null;
public static void main(String[] args)
{
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
try
{
while (true)
{ String[] list = Naming.list("rmi://" + args[0] + ":1099"); \\ ERRATA CORRIGE
if (list.length == 0)
{ System.out.println("Ed io ti frego ugualmente perche' mi sono tenuto la referenza all'oggetto remoto!!!!");
System.out.println("Local Date at & Time "+args[0]+" is: "+new Date());
System.out.println("Remote Date at & Time at "+args[0]+" is: "+server.getDate());
break;
}
else
{ server = (RemoteDate)Naming.lookup("rmi://"+args[0]+"/DateServer");
System.out.println("Local Date at & Time "+args[0]+" is: "+new Date());
System.out.println("Remote Date at & Time at "+args[0]+" is: "+server.getDate());
int c = System.in.read();
};
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}




Esercizio 3.3.

Fare il medesimo esercizio in cui RemoteDateClient.java e' rimpiazzzato da RemoteDateClient2.java (ovviamente ricompilate, ect...)
e RemoteDateServer.java e' rimpiazzzato da RemoteDateServer2.java (ovviamente ricompilate, ect...).

package servers;

import java.rmi.*;
import java.rmi.server.*;
import java.util.*;


class RemoteDateServer2 extends RemoteServer implements RemoteDate
{
int count = 1;

RemoteDateServer2() throws RemoteException {UnicastRemoteObject.exportObject(this);}


public Date getDate()
{
System.out.println("Il Client ha chiesto l'ora " + count + " volte");
if (count++ == 4)
{
try
{
System.out.println("Ora Basta!!!");
System.out.println("Sto facendo l'unbind dell'oggetto remoto dal Registro RMI");
Naming.unbind("DateServer");
System.out.println("Ho fatto l'unbind dell'oggetto remoto dal Registro RMI");
System.out.println("Caro Client comprati un orologio!");
System.out.println("Sto de-esportando l'oggetto!");
UnicastRemoteObject.unexportObject(this,true);
}
catch (Exception e)
{
e.printStackTrace(getLog());
}
};
return new Date();

}



public static void main(String[] args)
{
try
{
RemoteDateServer2 server = new RemoteDateServer2();
Naming.rebind("DateServer",server);
System.out.println("L'oggetto remoto e' in esecuzione e registrato nel registro RMI");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}



Esercizio 3.4 Lanciatevi in esperimenti vari.