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