Mes Projets

Java

Client Serveur TCP UDP

Client / Serveur TCP & UDP

Sockets, multithreading, gestion des connexions, portail de login

Développement d’une architecture complète client-serveur en Java. Le projet comprend un portail d’authentification, des modules TCP et UDP indépendants, et une gestion multithreadée des connexions.

Objectifs

  • Serveur multi-clients avec threads dédiés
  • Transmission TCP et UDP
  • Portail d’authentification obligatoire
  • Interface console claire et lisible

Technos & notions

  • Java SE – Sockets, DatagramSocket
  • Multithreading (Runnable / Thread)
  • Flux I/O et gestion d’exceptions

1 / Structure

Le projet est organisé en trois parties : le serveur, le client, et un portail de login. Chaque protocole (TCP, UDP) a ses propres classes client et serveur. L’application démarre par une authentification avant de lancer les modules réseau.

Structure du projet

2 / Portail d’authentification

Le client affiche un écran de connexion demandant identifiant et mot de passe. Ces informations sont envoyées au serveur, qui valide ou refuse l’accès. En cas de succès, l’utilisateur accède aux fonctions réseau.

// Exemple simplifié côté client
Socket socket = new Socket("127.0.0.1", 5000);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

System.out.print("Identifiant : ");
String user = sc.nextLine();
System.out.print("Mot de passe : ");
String pass = sc.nextLine();

out.println(user + ":" + pass);
String response = in.readLine();
if ("OK".equals(response)) {
    System.out.println("Connexion autorisée !");
} else {
    System.out.println("Accès refusé.");
}
              

3 / TCP – Serveur et Client

Le serveur TCP écoute sur un port et lance un thread par client. Le client envoie des messages textuels et reçoit les réponses du serveur. Chaque échange est journalisé.

Console TCP

4 / UDP – Serveur et Client

L’implémentation UDP repose sur des datagrammes indépendants. Le serveur reçoit et renvoie des paquets sans connexion persistante.

Test UDP

5 / Multithreading

Pour éviter les blocages lors de connexions multiples, le serveur crée un thread par client TCP ou par paquet UDP. Cela permet des échanges simultanés.

6 / Sécurité d’accès

L’accès aux modules TCP/UDP est protégé par le portail de connexion. Aucun client non authentifié ne peut établir de communication. Une fois connecté, l’utilisateur accède à l’interface réseau.

Jeu de Morpion Android

Jeu de Morpion Android

Interface Android, logique de jeu, intégration réseau

Développé en Java pour Android Studio, ce projet consiste en la création d’un jeu de Morpion interactif. L’objectif était de concevoir une application à la fois ergonomique et réactive, tout en appliquant les principes de programmation événementielle et de gestion d’état du jeu.

Fonctionnalités

  • Grille interactive & feedback visuel
  • Détection automatique des victoires / égalités
  • Reset de partie & gestion des scores
  • Connexion à un serveur (client côté app)

UX / UI

  • Écrans simples et lisibles
  • Toasts et états utilisateurs clairs
  • Compatibilité émulateur / device réel

Morpion.java – Logique et Implémentation

L’application repose sur une unique activité MainActivity et un layout XML définissant la grille. La logique principale gère la détection des clics, l’affichage des symboles, la vérification des combinaisons gagnantes et la réinitialisation de la partie. Ce projet illustre parfaitement la gestion d’événements et la programmation orientée objet dans un contexte Android.

Gestion des clics


public void onCellClick(View view) {
    Button cell = (Button) view;
    if (!cell.getText().toString().equals("") || gameOver) return;

    cell.setText(currentPlayer);
    checkForWin();

    if (!gameOver) {
        currentPlayer = (currentPlayer.equals("X")) ? "O" : "X";
        status.setText("Au tour de " + currentPlayer);
    }
}
              

Cette méthode est appelée lors du clic sur une case de la grille. Elle vérifie si la case est libre et si la partie n’est pas terminée. Si les conditions sont réunies, le symbole du joueur courant est inscrit, puis la fonction checkForWin() vérifie si une victoire est détectée. Si ce n’est pas le cas, le tour passe au joueur suivant.

Vérification des victoires


private void checkForWin() {
    for (int i = 0; i < 3; i++) {
        if (board[i][0].equals(board[i][1]) && board[i][1].equals(board[i][2]) && !board[i][0].equals("")) {
            status.setText("Le joueur " + board[i][0] + " a gagné !");
            gameOver = true;
            return;
        }
        if (board[0][i].equals(board[1][i]) && board[1][i].equals(board[2][i]) && !board[0][i].equals("")) {
            status.setText("Le joueur " + board[0][i] + " a gagné !");
            gameOver = true;
            return;
        }
    }

    if (board[0][0].equals(board[1][1]) && board[1][1].equals(board[2][2]) && !board[0][0].equals("")) {
        status.setText("Le joueur " + board[0][0] + " a gagné !");
        gameOver = true;
    } else if (board[0][2].equals(board[1][1]) && board[1][1].equals(board[2][0]) && !board[0][2].equals("")) {
        status.setText("Le joueur " + board[0][2] + " a gagné !");
        gameOver = true;
    }
}
              

Réinitialisation de la partie


public void resetGame(View view) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            board[i][j] = "";
            buttons[i][j].setText("");
        }
    }
    currentPlayer = "X";
    gameOver = false;
    status.setText("Au tour de " + currentPlayer);
}
              

Interface graphique (XML)


<GridLayout
    android:id="@+id/grid"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:columnCount="3"
    android:rowCount="3">

    <Button
        android:id="@+id/button00"
        android:onClick="onCellClick"
        android:text=""
        android:textSize="32sp"
        android:layout_width="100dp"
        android:layout_height="100dp" />

    <!-- ... autres boutons ... -->
</GridLayout>