Année: 2026-2027
Travaux pratiques 6
Objectifs
- Compréhension et modification du code, manipulation des images, et exécution des applications existantes sur la machine (Par exemple, Firefox/Chrome)
BMP (format d’image)
Le format BMP (Bitmap) utilise la représentation RGB (Rouge, Vert, Bleu) ou RGBA (Rouge, Vert, Bleu, Alpha) pour définir la couleur de chaque pixel. Chaque pixel est codé en utilisant une certaine quantité de bits, généralement 24 bits pour RGB et 32 bits pour RGBA. Dans le cas de RGB, chaque composante de couleur (R, G, B) est codée sur 8 bits chacune, permettant de représenter une large gamme de couleurs. L’ajout d’un canal Alpha (A) dans le format RGBA ajoute 8 bits supplémentaires pour gérer la transparence, ce qui est utile pour créer des images avec des zones partiellement transparentes.
Référence : https://fr.wikipedia.org/wiki/Windows_bitmap
JSON
Le format JSON (JavaScript Object Notation) est un format de données léger et lisible par les humains utilisé pour structurer et échanger des informations entre différentes applications. Il repose sur deux structures de base :
Objets: Les objets JSON sont des ensembles non ordonnés de paires clé-valeur. Chaque paire clé-valeur est séparée par deux-points (:), et les paires sont séparées par des virgules. Par exemple :
{
"nom": "Pierre Dupont",
"année": 4
}
Tableaux: Les tableaux JSON sont des listes ordonnées de valeurs. Les valeurs peuvent être des chaînes de caractères, des nombres, des booléens, des objets JSON ou des tableaux JSON. Les valeurs d’un tableau JSON sont séparées par des virgules et entourées de crochets, par exemple :
["rouge", "vert", "bleu"]
Le format JSON est facilement lisible par les humains, ce qui le rend populaire pour stocker et échanger des données structurées.
Référence : https://fr.wikipedia.org/wiki/JavaScript_Object_Notation
Exercice 6.1 [★]
Analyse des images
Créer un système client-serveur qui analyse des images BMP, extrait les dix premières couleurs de l’image, et génère des graphiques en utilisant SVG en fonction des couleurs extraites.
Description : Pour atteindre cet objectif, suivez les instructions suivantes :
- Utilisez les fichiers nécessaires :
client.c,client.h,serveur.c,serveur.h,couleur.h,couleur.c,bmp.c,bmp.h, et le fichierMakefile. - Téléchargez également le dossier “images” qui contient des images au format BMP provenant de Wikimedia Commons.
- Assurez-vous de comprendre le contenu des fichiers
bmp.c,bmp.h,couleur.hetcouleur.cqui vous permettront d’analyser les images BMP. - Utilisez la commande
makepour compiler les fichiers et générer les fichiers exécutables. - Ouvrez deux terminaux. Dans le premier terminal, exécutez le serveur en utilisant la commande
./serveur. - Dans le second terminal, exécutez le client en utilisant la commande
./client chemin_d’une_image_bmp, en remplaçantchemin_d’une_image_bmppar le chemin d’accès à une image BMP que vous souhaitez utiliser. - Le client analyse l’image BMP spécifiée et extrait les dix premières couleurs de l’image.
- Ensuite, le client envoie ces couleurs au serveur.
- Le serveur reçoit les couleurs et exécute une commande existante sur votre machine, en l’occurrence
firefox. - Vérifiez que le graphique généré par
firefoxest basé sur les couleurs extraites de l’image BMP. - Testez votre code en utilisant différentes images BMP pour voir comment les graphiques sont générés en fonction des couleurs de chaque image.
En suivant ces instructions, vous pourrez créer un système client-serveur qui analyse des images BMP, extrait les couleurs et génère des graphiques en utilisant firefox en fonction des couleurs extraites.
Exercice 6.2 [★★]
Analyse des images
L’objectif de cet exercice est de permettre à l’utilisateur de saisir le nombre de couleurs (toujours inférieur ou égal à 30) lors de l’exécution du client et du serveur, puis adapter le traitement en conséquence.
Pour permettre à l’utilisateur de spécifier le nombre de couleurs à traiter, des modifications doivent être apportées aux fichiers serveur.c et client.c. Voici comment effectuer ces modifications :
Dans serveur.c :
- Modifiez la partie du code où le serveur reçoit les couleurs pour prendre en compte la réception préalable du nombre de couleurs saisi par l’utilisateur. Vous devrez donc ajouter une étape où le serveur reçoit d’abord ce nombre, puis reçoit les couleurs correspondantes.
- Assurez-vous de mettre à jour le code pour traiter les couleurs en fonction du nombre saisi. Par exemple, si l’utilisateur saisit 10 couleurs, le serveur doit toujours traiter les 10 premières couleurs de l’image.
Dans client.c :
- Modifiez la partie du code où le client envoie les couleurs pour inclure également l’envoi du nombre de couleurs saisi par l’utilisateur.
- Lorsque le client lit les couleurs de l’image, assurez-vous de lire le nombre de couleurs saisi par l’utilisateur avant de lire les couleurs elles-mêmes.
- Envoyez d’abord le nombre de couleurs au serveur, suivi des couleurs extraites de l’image.
Une fois que vous avez apporté ces modifications aux deux fichiers, vous pouvez tester votre code en saisissant différents nombres de couleurs lors de l’exécution du client. Le serveur devrait être capable de traiter le nombre de couleurs spécifié par l’utilisateur et de générer un graphique en conséquence.
N’oubliez pas d’utiliser la commande make pour recompiler vos fichiers après avoir apporté ces modifications.
Exercice 6.3 [★★★]
Objectif : Modifier le code client.c et serveur.c pour utiliser un format de messages structuré inspiré de JSON lors de la communication entre le client et le serveur.
Actuellement, les fichiers client.c et serveur.c utilisent des messages simples pour communiquer. L’objectif est de passer à un format plus structuré, lisible et vérifiable. Les messages contiendront un code d’opération et des valeurs associées.
Instructions :
- Dans client.c :
- Modifiez le code pour créer des messages structurés. N’utilisez pas de bibliothèque JSON externe.
- Remplacez les anciens messages simples par les nouveaux messages structurés. Par exemple, remplacez “message: bonjour” par un message contenant explicitement un champ
code.
- Dans serveur.c :
- Modifiez le code pour traiter les messages reçus du client. Analysez les messages pour extraire les informations nécessaires, telles que le code de l’opération et les valeurs associées.
- Répondez au client avec le même format structuré. Par exemple, si le client envoie une demande de calcul, le serveur doit renvoyer une réponse contenant le résultat ou une erreur.
- Assurez-vous de mettre à jour les instructions et les commentaires pour refléter le nouveau format des messages.
- Vérifiez les longueurs des chaînes, les délimiteurs attendus, les nombres de valeurs et les erreurs de parsing.
Exemple : Supposons que le client souhaite envoyer une demande de calcul d’addition au serveur. Au lieu d’envoyer “calcule: + 23 45”, le client enverra un message structuré tel que :
{
"code": "calcule",
"valeurs": ["+", "23", "45"]
}
Le serveur analysera ce message, effectuera le calcul demandé, puis renverra la réponse au client avec le même format.
Analyse critique :
Un véritable parseur JSON robuste est complexe. Dans cet exercice, limitez volontairement le format accepté et documentez ces limites. Un message inattendu ne doit pas provoquer de dépassement de tampon, de lecture hors limites ou d’arrêt brutal du serveur.
Autres exemples :
{
"code" : "message",
"valeurs" : [ "bonjour"]
}
{
"code" : "couleurs",
"valeurs" : [ "0effeee", "..."]
}
Fichiers
bmp.c, bmp.h, client.c, client.h, couleur.c, couleur.h, Makefile, serveur.c, serveur.h
Instructions
- N’oubliez pas les commentaires (nom du fichier, objectif, auteurs, lignes importantes de code, etc.).