/* * ChatServer.java */ import java.net.*; import java.io.*; import java.util.Vector; // Classe qui s'occupe de la gestion d'un client // Il y aura un objet de cette classe par client class GestionClient extends Thread { // Tableau qui contient tous les PrintStream vers les clients // Il est partagé par tous les clients (il faudra utiliser synchronized) public static Vector clients = new Vector(); // Socket vers mon client Socket monSocket; // Flux de/vers mon client PrintStream ps; BufferedReader br; boolean fini; public GestionClient(Socket socket) { try { monSocket = socket; // crèe les flux depuis/vers le client br = new BufferedReader(new InputStreamReader(monSocket.getInputStream())); ps = new PrintStream(monSocket.getOutputStream()); // on rajoute le PrintStream au vecteur synchronized(clients) { clients.addElement(ps); } } catch(IOException e) { e.printStackTrace(); } } // Réception et Envoi des messages public void run() { try { String s; while(!fini) { // on lit sur le flux du socket s = br.readLine(); // si on a reçu fini c'est la fin de ce client if (s.equals("fin")) { // c'est la fin fini = true; // on envoie "fini" au client pour arrêter son thread ps.println(s); // on enlève le printstream du vecteur synchronized(clients) { clients.remove(ps); } } else // on écrit sur les printstream de tous les clients synchronized(clients) { for(int i = 0; i < clients.size(); i++) { // on récupère un printstream PrintStream psc = (PrintStream) clients.elementAt(i); // on écrit dessus psc.println(s); } } } } catch(IOException e) { e.printStackTrace(); } } } public class ChatServer { public static void main (String args[]) { ServerSocket leServeur = null; Socket connexionCourante; try { leServeur = new ServerSocket(2000); while (true) { connexionCourante = leServeur.accept(); // on crèe un objet GestionClient pour ce client GestionClient gc = new GestionClient(connexionCourante); // on démarre son Thread gc.start(); } } catch (Exception ex) { ex.printStackTrace(); } } }