Académique Documents
Professionnel Documents
Culture Documents
try {
switch(tab[0]){
case "CREATION":
Gestion Proto
! Le serveur devra implanter les requêtes suivantes :
! CREATION id somme_initiale
permet de demander la création d’un compte identifié par id sur
lequel sera placé la somme_initiale.
! POSITION id
permet d’obtenir la position courante du compte identifié par id.
! AJOUT id somme
ajoute une somme sur le compte identifié par id.
! RETRAIT id somme
retire une somme sur le compte identifié par id.
Gestion Proto
! Le client recevra les réponses du serveur sous la forme suivante :
! OK commande
informe le client que la commande s'est correctement déroulée.
! ERREUR raison
la raison de l'échec de la commande sous forme de chaîne de caractères.
! POS solde date_dernière_opération
envoi au client le solde actuel du compte et la date de la dernière opération.
b.creerCompte(tab[1],somme);
case "AJOUT":
somme = Double.parseDouble(tab[2]);
b.ajouter(tab[1],somme);
somme = Double.parseDouble(tab[2]);
b.retirer(tab[1],somme);
case "POSITION":
b.getDerniereOperation(tab[1]);
} // switch
Gestion Proto
} // switch
} catch(RuntimeException e) {
} // traiter
} // class
Serveur
! Version finale gérant TCP et UDP
dg.start();
...
Serveur
! Version TCP en multi-thread
! Socket d’écoute sur le port 1234 (même port
que UDP)
! Boucle infinie faisant des accept + création de
thread
! Threads gérant chacun un socket de service
! Tous les threads partagent le même Gestion
Proto
Th Ecoute TCP
try {
ServerSocket ecoute = new ServerSocket(1234);
while(true) {
Socket service = ecoute.accept();
ThreadService s = new ThreadService(service,
proto);
s.start();
}
} catch(IOException e) { e.printStackTrace();}
} // main
} // class
Serveur
! Thread service TCP
! Attention : méthode run() sans paramètre.
! On doit travailler avec le socket de service et le gestion
proto
! Récupération du socket de service (un par thread)
! Et du GestionProto (partagé par tous les threads – d’où
le synchronized) dans le constructeur
! On recopie les références dans des attributs pour
pouvoir les utiliser dans la méthode run()
Thread Service
public class ThreadService extends Thread {
private Socket service;
private GestionProto proto;
public ThreadService(Socket service, GestionProto proto) {
this.service = service;
this.proto = proto;
}
...
Serveur
! Thread service TCP
! Méthode run()
! Lecture : BufferedReader
! Ecriture : PrintStream
! C’est le type de System.out
...
while (true) {
sortie.println(reponse);
} catch(IOException e) { e.printStackTrace();}
}
}
Serveur
! Thread gérant UDP
! Constructeur qui récupère le Gestion Proto (partagé
avec la partie TCP)
! On recopie la référence dans un attribut pour l’utiliser
dans la méthode run()
Thread DG
public class ThreadDG extends Thread {
...
Serveur
! Thread gérant UDP
! DatagramSocket utilisant le même numéro de port que la partie TCP (il y a
autant de ports TCP que de ports UDP)
! Les données vont dans le tampon, l’adresse IP et le port distants dans des
attributs (getAddress() et getPort())
! On renvoie à l’expéditeur (son addresse et son port sont dans les attributs)
Thread DG
public class ThreadDG extends Thread {
...
while (true) {
sock.receive(dg);
dg.setData(repBytes);
sock.send(dg);
} catch(IOException e) { e.printStackTrace();}
}
Client TCP
! Créer un socket client en précisant le nom de la machine
serveur (ou son adresse IP) et le numéro de port
! On attend la réponse
InetAddress adrServeur =
InetAddress.getByName("localhost");
sock.send(dg);
sock.receive(dg2);
System.out.println(reponse);
} catch(IOException e) { e.printStackTrace();}