Protocole 1 Implantation des canaux 2 Implantation d`un

Transcription

Protocole 1 Implantation des canaux 2 Implantation d`un
Programmation réseaux en Java (INA136)
FIP SESF 3ème année (ING56)
Protocole
1 Implantation des canaux
Voici les interfaces Java modélisant l’extrémité d’un canal en lecture (IObjectInput<A>) et en
écriture (IObjectOutput<B>) :
interface IObjectInput<A> {
A readObject();
}
interface IObjectOutput<B> {
void writeObject(B arg);
}
a) Ecrire deux classes LocalObjectInput<A> et LocalObjectOutput<B> qui implantent respectivement les interfaces IObjectInput<A> et IObjectOutput<B> ci-dessus en utilisant
l’interface BlockingQueue<E>. Cette implantation ne sérialise pas les objets (et il n’est pas
nécéssaire de les cloner puisqu’ils sont supposés immutables) et elle est statiquement typée.
b) Ecrire deux classes RemoteObjectInput<A> et RemoteObjectOutput<B> qui implantent respectivement les interfaces IObjectInput<A> et IObjectOutput<B> ci-dessus en utilisant les
classes non génériques ObjectInputStream et ObjectOutputStream. Cette implantation
sérialise les objets et fait des conversions de type (non vérifiables statiquement).
2 Implantation d’un dictionnaire distant
Implanter un dictionnaire (interface Map<K,V>) consultable et modifiable à distance. Un requète
d’insertion prend en paramètre une clé et une valeur qui doivent être ajouté au dictionnaire par
le serveur. Une requète de consultation prend en paramètre une liste de clés et le serveur doit
retourner la liste des valeurs correspondantes. Le protocole étant de haut niveau, et on utilisera les
classes immutables générées par dataGen (données en annexe) à partir de la définition de protocole
suivante :
datatype (’K , ’V ) Request
= Insert of { key : ’K , value : ’V }
| Read of { keys : ’K list }
datatype ’V Answer
= Result of { values : ’V list }
3 Programme principal
Votre serveur doit pouvoir être exécutée deux manières :
Implantation locale. Les canaux utilisent l’implantation (a) de la section 1.
Implantation distante. Les canaux utilisent les sockets et la sérialisation et l’implantation (b) de la section 1. Le numéro de port sera un paramère optionnel du client et du
serveur, on utilisera par default le port 9999.
1
4 Annexe
//datatype (’K , ’V ) Request
// = Insert of { key : ’K , value : ’V }
// | Read of { keys : ’K list }
//
//datatype ’V Answer
// = Result of { values : ’V list }
abstract class Request<K ,V > implements Serializable {
public abstract <A> A accept (RequestVisitor <A,K ,V > v );
}
class Insert<K ,V > extends Request <K ,V > {
public final K key;
public final V value;
public Insert (K key, V value) {
this.key = key;
this.value = value;
}
public <A> A accept (RequestVisitor <A,K ,V > v ) {
return v .visit (this);
}
}
class Read <K ,V > extends Request <K ,V > {
public final List <K > keys;
public Read (List<K > keys) {
this.keys = keys;
}
public <A> A accept (RequestVisitor <A,K ,V > v ) {
return v .visit (this);
}
}
interface RequestVisitor <A,K ,V > {
public A visit (Insert<K ,V > r );
public A visit (Read <K ,V > r );
}
abstract class Answer <V > implements Serializable {
public abstract <A> A accept (AnswerVisitor <A,V > v );
}
class Result <V > extends Answer <V > {
public final List <V > values;
public Result (List<V > values) {
this.values = values;
}
public <A> A accept (AnswerVisitor <A,V > v ) {
return v .visit (this);
}
}
interface AnswerVisitor <A,V > {
public A visit (Result <V > a);
}
2

Documents pareils