TP N°6: Construction d’un Serveur Multi-Client Les Threads en Java (Processus Légers)
Thread = un fil (d’exécution) Une méthode pour créer un thread en java, consiste à: Définir la tâche exécutée par le thread Lier la tâche au thread Lancer le thread
Classe Thread: un premier exemple Créer un nouveau projet ThreadExemples (Main Class Cochée)
Thread Principal
Créer un nouveau thread Définir la tâche du thread = Créer un objet Runnable Runnable est une interface public interface Runnable { public abstract void run(); } En fait, une interface est une classe abstraite dont toutes les méthodes sont abstraites et dont tous les attributs sont constants (des constantes, voir le mot-clé final). L'interface Runnable doit être implémentée par n'importe quelle classe dont les instances sont destinées à être exécutées par un thread. La classe doit définir une méthode sans argument appelée run. Navigate : go to source
Ajouter une classe «Tâche» dans le projet précédent : New / Java Class La tâche ici = Calcul le Produit de deux entiers
public class Tache implements Runnable { int x; int y; Tache(int x,int y) {this.x=x; this.y=y;} //Constructeur public void run(){ // Méthode run() System.out.println(Thread.currentThread().getName()); System.out.println(x+"*"+y+"="+x*y); } }
Dans le main: Runnable job = new Tache(5,6); Thread t = new Thread(job); t.setName("t1"); // Optionnel t.start();
Créer plusieurs threads: Ordre choisi par l’ordonnanceur de la JVM
Solution À l’arrivée d’un nouveau client, créer un nouveau thread Notre serveur peut prendre en charge plusieurs clients mais à tour de rôle: Solution À l’arrivée d’un nouveau client, créer un nouveau thread serveur Multi-client ( multi-threaded)
Créer un nouveau projet: Main Tâche du thread
Modifions le code du Serveur: ServerSocket svr = new ServerSocket(5000); while (true) { Socket sClient = svr.accept(); Runnable jobtodo = new TraitReq(sClient); Thread t = new Thread(jobtodo); t.start(); System.out.print ("Le Serveur a créé le thread"+t.getName()+"\n"); }
Traitement de la Requête Client Tâche du thread Traitement de la Requête Client
public class TraitReq implements Runnable { Socket client; TraitReq(Socket client) { this.client = client;} // Constructeur public void run() { // Copier Coller Try { DataInputStream Sin = new DataInputStream(client.getInputStream()); DataOutputStream Sout= new DataOutputStream(client.getOutputStream()); String ch; ch= Sin.readUTF(); while (!ch.equalsIgnoreCase("Fin")){ Sout.writeUTF(ch.toUpperCase()); ch = Sin.readUTF();} client.close();
Et Enfin … Lancer le Serveur Multi-Client Lancer plusieurs Clients Observer l’affichage dans la console côté Serveur