From cbd66fbc025755805f218e6835d406d139316e08 Mon Sep 17 00:00:00 2001
From: Sarah CHERCHEM <ls_cherchem@esi.dz>
Date: Thu, 27 Feb 2025 17:10:30 +0100
Subject: [PATCH] test du serveur avec plusieurs clients

---
 src/Client.java  |   4 +-
 src/Client2.java |  93 ++++++++++++++++++++++++++++++++++++++
 src/Server.java  | 113 +++++++++++++++++++++++++++++++++++++++++++++++
 src/server.java  |   4 --
 4 files changed, 208 insertions(+), 6 deletions(-)
 create mode 100644 src/Client2.java
 create mode 100644 src/Server.java
 delete mode 100644 src/server.java

diff --git a/src/Client.java b/src/Client.java
index 13d93e9..9ec020c 100644
--- a/src/Client.java
+++ b/src/Client.java
@@ -15,6 +15,7 @@ public class Client {
     public Client() {
         scanner = new Scanner(System.in);
     }
+
     public void connect() {
         try {
             socket = new Socket(SERVER_ADDRESS, PORT);
@@ -44,7 +45,7 @@ public class Client {
 
             System.out.println("Réponse du serveur : " + response);
 
-            if (response.equals("4 0")) {
+            if (response.contains("Félicitations")) {
                 System.out.println("Félicitations ! Vous avez trouvé la bonne combinaison !");
                 break;
             }
@@ -86,7 +87,6 @@ public class Client {
         }
     }
 
-
     public static void main(String[] args) {
         new Client().connect();
     }
diff --git a/src/Client2.java b/src/Client2.java
new file mode 100644
index 0000000..2b4a3e5
--- /dev/null
+++ b/src/Client2.java
@@ -0,0 +1,93 @@
+package src;
+
+import java.io.*;
+import java.net.*;
+import java.util.Scanner;
+
+public class Client2 {
+    private static final String SERVER_ADDRESS = "localhost";
+    private static final int PORT = 1234;
+    private Socket socket;
+    private BufferedReader in;
+    private PrintWriter out;
+    private Scanner scanner;
+
+    public Client2() {
+        scanner = new Scanner(System.in);
+    }
+
+    public void connect() {
+        try {
+            socket = new Socket(SERVER_ADDRESS, PORT);
+            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+            out = new PrintWriter(socket.getOutputStream(), true);
+            System.out.println("Connecté au serveur Mastermind !");
+            play();
+        } catch (IOException e) {
+            System.err.println("Erreur de connexion au serveur : " + e.getMessage());
+        } finally {
+            closeConnection();
+        }
+    }
+
+    private void play() {
+        while (true) {
+            String guess = getUserInput();
+            if (guess == null) continue;
+
+            sendGuess(guess);
+            String response = receiveResponse();
+
+            if (response == null) {
+                System.out.println("Connexion fermée par le serveur.");
+                break;
+            }
+
+            System.out.println("Réponse du serveur : " + response);
+
+            if (response.contains("Félicitations")) {
+                System.out.println("Félicitations ! Vous avez trouvé la bonne combinaison !");
+                break;
+            }
+        }
+    }
+
+    private String getUserInput() {
+        System.out.print("Entrez une combinaison (4 lettres parmi B,G,O,R,W,Y) : ");
+        String input = scanner.nextLine().toUpperCase();
+
+        if (!input.matches("[BGORWY]{4}")) {
+            System.out.println("Combinaison invalide, veuillez entrer exactement 4 lettres parmi B, G, O, R, W, Y.");
+            return null;
+        }
+        return input;
+    }
+
+    private void sendGuess(String guess) {
+        out.println(guess);
+    }
+
+    private String receiveResponse() {
+        try {
+            return in.readLine();
+        } catch (IOException e) {
+            System.err.println("Erreur de lecture du serveur : " + e.getMessage());
+            return null;
+        }
+    }
+
+    private void closeConnection() {
+        try {
+            if (socket != null) socket.close();
+            if (in != null) in.close();
+            if (out != null) out.close();
+            scanner.close();
+        } catch (IOException e) {
+            System.err.println("Erreur lors de la fermeture des ressources : " + e.getMessage());
+        }
+    }
+
+    public static void main(String[] args) {
+        new Client2().connect();
+    }
+}
diff --git a/src/Server.java b/src/Server.java
new file mode 100644
index 0000000..09a1508
--- /dev/null
+++ b/src/Server.java
@@ -0,0 +1,113 @@
+package src;
+
+import java.io.*;
+import java.net.*;
+import java.util.Random;
+
+public class Server {
+    private static final int PORT = 1234;
+    private static final int CODE_LENGTH = 4;
+    private Code secretCode;
+
+    public Server() {
+        this.secretCode = generateSecretCode();
+        System.out.println("Code secret généré : " + secretCode);
+    }
+
+    private Code generateSecretCode() {
+        Random random = new Random();
+        return new Code(random);  // Génère un code secret aléatoire
+    }
+
+    public void start() {
+        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
+            System.out.println("Serveur en attente de connexions sur le port " + PORT + "...");
+
+            // Serveur qui accepte plusieurs clients simultanément
+            while (true) {
+                try {
+                    // Accepte un client et lui attribue un thread pour gérer la communication
+                    Socket clientSocket = serverSocket.accept();
+                    System.out.println("Client connecté !");
+                    new Thread(new ClientHandler(clientSocket)).start();
+                } catch (IOException e) {
+                    System.err.println("Erreur lors de l'acceptation d'un client : " + e.getMessage());
+                }
+            }
+        } catch (IOException e) {
+            System.err.println("Erreur lors du démarrage du serveur : " + e.getMessage());
+        }
+    }
+
+    // Classe pour gérer un client dans un thread séparé
+    private class ClientHandler implements Runnable {
+        private Socket clientSocket;
+        private BufferedReader in;
+        private PrintWriter out;
+
+        public ClientHandler(Socket socket) {
+            this.clientSocket = socket;
+            try {
+                this.in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
+                this.out = new PrintWriter(clientSocket.getOutputStream(), true);
+            } catch (IOException e) {
+                System.err.println("Erreur lors de la création des flux d'entrée/sortie : " + e.getMessage());
+            }
+        }
+
+        @Override
+        public void run() {
+            try {
+                String input;
+                int attempts = 0;
+
+                // Interaction avec le client
+                while ((input = in.readLine()) != null) {
+                    attempts++;
+                    System.out.println("Tentative " + attempts + " du client : " + input);
+
+                    // Vérifier si la combinaison est valide
+                    if (input.length() != CODE_LENGTH || !input.matches("[BGORWY]{4}")) {
+                        out.println("Erreur : Entrée invalide. Essayez encore.");
+                        continue;
+                    }
+
+                    // Créer une instance de Code à partir de l'entrée du client
+                    Code guess = new Code(input);
+                    int correctPosition = secretCode.numberOfColorsWithCorrectPosition(guess);
+                    int incorrectPosition = secretCode.numberOfColorsWithIncorrectPosition(guess);
+
+                    // Envoyer le résultat au client
+                    out.println(correctPosition + " " + incorrectPosition);
+
+                    // Vérifier si le client a trouvé la bonne combinaison
+                    if (correctPosition == CODE_LENGTH) {
+                        System.out.println("Le client a trouvé la combinaison " + secretCode + " en " + attempts + " essais.");
+                        out.println("Félicitations ! Vous avez trouvé la bonne combinaison !");
+                        break;
+                    }
+                }
+            } catch (IOException e) {
+                System.err.println("Erreur de communication avec le client : " + e.getMessage());
+            } finally {
+                closeConnection();
+            }
+        }
+
+        // Fermeture propre des ressources
+        private void closeConnection() {
+            try {
+                if (clientSocket != null) clientSocket.close();
+                if (in != null) in.close();
+                if (out != null) out.close();
+            } catch (IOException e) {
+                System.err.println("Erreur lors de la fermeture de la connexion : " + e.getMessage());
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+        Server server = new Server();
+        server.start();
+    }
+}
diff --git a/src/server.java b/src/server.java
deleted file mode 100644
index 8f410c6..0000000
--- a/src/server.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package src;
-
-public class server {
-}
-- 
GitLab