TP : Socket et JDBC en JAVA

Je m’excuse pour cet oubli. Voici l’ensemble complet incluant le client, la structure de la base de données, et le téléchargement de MySQL Connector/J.

  1. Structure de la Base de Données :

Assurez-vous d’avoir une base de données MySQL avec une table appelée data contenant deux colonnes : code et information.

CREATE TABLE IF NOT EXISTS data (
    code VARCHAR(50) PRIMARY KEY,
    information VARCHAR(255)
);
  1. Téléchargement de MySQL Connector/J :

Vous pouvez télécharger le pilote JDBC MySQL (Connector/J) à partir du lien que vous avez fourni : MySQL Connector/J Downloads.

  1. Client Socket :
import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        final String HOST = "localhost";
        final int PORT = 12345;

        try {
            Socket socket = new Socket(HOST, PORT);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

            // Exemple de demande client
            String code = "1234";
            out.println(code);

            // Lire la réponse du serveur
            String reponse = in.readLine();
            System.out.println("Réponse du serveur : " + reponse);

            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. Classe de Connexion à la Base de Données :
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Connexion {
    static final String DB_URL = "jdbc:mysql://localhost:3306/nom_base_de_donnees";
    static final String USER = "nom_utilisateur";
    static final String PASS = "mot_de_passe";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(DB_URL, USER, PASS);
    }
}

Assurez-vous de remplacer "nom_base_de_donnees", "nom_utilisateur" et "mot_de_passe" par les détails de votre base de données.

  1. Classe de Traitement des Demandes Clients :
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class TraitementDemandes {
    private Connection conn;

    public TraitementDemandes() throws SQLException {
        conn = Connexion.getConnection();
    }

    public String traiterDemande(String code) {
        String reponse = "";
        try {
            // Récupérer les informations correspondant au code de la base de données
            String sql = "SELECT information FROM data WHERE code = ?";
            PreparedStatement preparedStatement = conn.prepareStatement(sql);
            preparedStatement.setString(1, code);
            ResultSet resultSet = preparedStatement.executeQuery();

            // Stocker les informations dans une collection temporaire (ici une HashMap)
            Map<String, String> informations = new HashMap<>();
            while (resultSet.next()) {
                String information = resultSet.getString("information");
                informations.put(code, information);
            }

            // Générer la réponse à envoyer au client
            reponse = informations.getOrDefault(code, "Aucune information trouvée pour ce code.");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return reponse;
    }
}
  1. Classe de Serveur Socket :
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Serveur {
    public static void main(String[] args) {
        final int PORT = 12345;

        try {
            ServerSocket serverSocket = new ServerSocket(PORT);
            System.out.println("Serveur démarré...");

            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.out.println("Nouvelle connexion : " + clientSocket);

                // Lancer un thread pour gérer la connexion du client
                new Thread(new ClientHandler(clientSocket)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static class ClientHandler implements Runnable {
        private final Socket clientSocket;

        ClientHandler(Socket socket) {
            this.clientSocket = socket;
        }

        public void run() {
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())), true);

                String code;
                while ((code = in.readLine()) != null) {
                    // Traiter la demande du client
                    TraitementDemandes traitementDemandes = new TraitementDemandes();
                    String reponse = traitementDemandes.traiterDemande(code);

                    // Envoyer la réponse au client
                    out.println(reponse);
                }

                clientSocket.close();
            } catch (IOException | SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Dans ce cas, le serveur écoute les connexions entrantes sur un port spécifié (PORT). Lorsqu’un client se connecte, un thread ClientHandler est lancé pour gérer la connexion du client. Dans ce thread, les demandes du client sont lues, traitées à l’aide de la classe TraitementDemandes, puis les réponses sont envoyées au client.

Assurez-vous d’ajouter le fichier MySQL Connector/J (jar) à votre projet pour que le code puisse fonctionner correctement.