🔌 Protocole WebSocket MateZone

Documentation technique complète du protocole de communication temps réel entre client et serveur.

Vue d'ensemble du protocole

MateZone utilise un protocole WebSocket structuré basé sur JSON pour assurer une communication fiable

📦

ChatEventDTO

Classe principale de transfert de données responsable de la structure des événements de chat échangés en JSON.

Format standardisé pour tous les échanges client-serveur
🏷️

EventEnum

Énumération définissant les types d'événements et leurs clés de données requises pour garantir la cohérence.

Validation automatique des messages échangés

Structure ChatEventDTO

Anatomie complète de la classe principale de communication

// Structure générale d'un ChatEventDTO
{
  "type": "MESSAGE",           // Type d'événement (EventEnum)
  "data": {                    // Map des données
    "idClient": "user123",
    "pseudo": "Alice",
    "contenu": "Hello World!",
    "date": "2024-01-15T10:30:00Z"
  },
  "lstEventDTO": []           // Liste optionnelle d'autres ChatEventDTO
}

🎯 Type

Définit le type d'événement selon l'énumération EventEnum. Détermine les clés de données requises.

📊 Data

Map clé-valeur contenant les données spécifiques à l'événement selon son type.

📋 LstEventDTO

Liste optionnelle d'événements, utilisée principalement pour MESSAGE_LIST.

Types d'événements (EventEnum)

Catalogue complet des événements supportés par le protocole

🔐 Authentification

LOGIN

Clés requises : pseudo, mot de passe

{
  "type": "LOGIN",
  "data": {
    "pseudo": "alice",
    "motDePasse": "secretPassword"
  }
}

SIGNUP

Clés requises : pseudo, mot de passe

{
  "type": "SIGNUP",
  "data": {
    "pseudo": "newUser",
    "motDePasse": "newPassword"
  }
}

SUCCESS_LOGIN

Clés requises : identifiant utilisateur, pseudo

SUCCESS_SIGNUP

Clés requises : identifiant utilisateur, pseudo

💬 Messages

MESSAGE

Clés requises : identifiant client, pseudo, contenu, date

{
  "type": "MESSAGE",
  "data": {
    "idClient": "user123",
    "pseudo": "Alice",
    "contenu": "Bonjour !",
    "date": "2024-11-11T10:30:00Z"
  }
}

NEW_MESSAGE

Clés requises : identifiant client, identifiant canal, contenu

NEW_MESSAGE_IMG

Clés requises : identifiant groupe, identifiant client, données binaires

MESSAGE_LIST

Utilise lstEventDTO - Aucune clé data requise

📡 Canaux

NEW_CHANNEL

Clés requises : identifiant du canal

{
  "type": "NEW_CHANNEL",
  "data": {
    "idCanal": "channel_001"
  }
}

⚠️ Réponses système

SUCCESS

Clés requises : message de succès

ERROR

Clés requises : message d'erreur

{
  "type": "ERROR",
  "data": {
    "messageErreur": "Connexion échouée"
  }
}

API ChatEventDTO

Méthodes principales pour manipuler les événements de chat

🔧 Construction

// Constructeurs
ChatEventDTO()
ChatEventDTO(EventEnum type)
ChatEventDTO(EventEnum type, List<ChatEventDTO> lstEventDTO)

// Ajout de données (pattern Builder)
ChatEventDTO add(String key, Object value)

// Exemple d'utilisation
ChatEventDTO event = new ChatEventDTO(EventEnum.NEW_MESSAGE)
    .add("idClient", "user123")
    .add("idCanal", "channel1")
    .add("contenu", "Hello!");

🔄 Sérialisation JSON

// Vers JSON
String json = event.toJson();

// Depuis JSON
ChatEventDTO event = ChatEventDTO.jsonToEventDTO(jsonString);

// Depuis JSON avec liste d'événements
ChatEventDTO eventWithList = 
    ChatEventDTO.jsonToLstEventDTO(jsonString);

📊 Accès aux données

// Accès aux données
Map<String, Object> data = event.getData();
Object value = event.getDataIndex(0); // Par index
List<ChatEventDTO> messages = event.getLstMes();

// Getters/Setters
EventEnum type = event.getType();
event.setType(EventEnum.MESSAGE);
event.setData(dataMap);

🔍 Validation EventEnum

// Récupération des clés requises
List<String> requiredKeys = EventEnum.LOGIN.getRequiredKeys();
// Résultat: ["pseudo", "motDePasse"]

// Accès par index
String keyName = EventEnum.MESSAGE.getKeyIndex(0);
// Résultat: "idClient"

Flux de communication typiques

Exemples concrets d'échanges client-serveur

🔐 Séquence de connexion

  1. Client → Serveur : LOGIN
    {
      "type": "LOGIN",
      "data": {
        "pseudo": "alice",
        "motDePasse": "secret123"
      }
    }
  2. Serveur → Client : SUCCESS_LOGIN
    {
      "type": "SUCCESS_LOGIN",
      "data": {
        "idUtilisateur": "user_456",
        "pseudo": "alice"
      }
    }

💬 Séquence de message

  1. Client → Serveur : NEW_MESSAGE
    {
      "type": "NEW_MESSAGE",
      "data": {
        "idClient": "user_456",
        "idCanal": "general",
        "contenu": "Salut tout le monde !"
      }
    }
  2. Serveur → Tous les clients : MESSAGE
    {
      "type": "MESSAGE",
      "data": {
        "idClient": "user_456",
        "pseudo": "alice",
        "contenu": "Salut tout le monde !",
        "date": "2024-11-11T15:30:45Z"
      }
    }

Gestion d'erreurs et bonnes pratiques

Comment le protocole gère les erreurs et assure la robustesse

⚠️

Types d'erreurs

  • Authentification échouée
  • Données manquantes
  • Format JSON invalide
  • Type d'événement non reconnu
  • Erreur serveur
🔍

Validation

Le protocole valide automatiquement :

  • Structure JSON correcte
  • Présence du champ type
  • Clés requises selon EventEnum
  • Types de données cohérents

Bonnes pratiques

  • Toujours vérifier le type d'événement
  • Gérer les erreurs côté client
  • Utiliser les constructors adaptés
  • Valider les données avant envoi

⚠️ Important

Tous les échanges doivent respecter la structure ChatEventDTO. Les messages mal formés seront rejetés par le serveur avec un événement ERROR contenant les détails de l'erreur.