Projet de Téléinformatique - Application Python pour la surveillance des ressources système en temps réel via communication réseau TCP/IP.
- Description du Projet
- Architecture Générale
- Installation et Lancement
- Protocole de Communication
- Structure de la Base de Données
- Description des Fichiers
- Format des Rapports
- Configuration
- Guide d'Utilisation
- Stress Test
- Exemples de Sortie
- FAQ
Créer un système de monitoring distribué permettant de :
- Collecter les métriques système (CPU, RAM) depuis plusieurs machines
- Transmettre ces données en temps réel via TCP/IP
- Stocker les données dans une base SQLite
- Générer des rapports automatiques (JSON, CSV, HTML)
| Caractéristique | Valeur |
|---|---|
| Langage | Python 3.11+ |
| Protocole | TCP/IP (Socket) |
| Base de données | SQLite |
| Interface graphique | Tkinter |
| Dépendances | Aucune (stdlib uniquement) |
| Port par défaut | 65432 |
┌─────────────────────────────────────────────────────────────────────────┐
│ ARCHITECTURE DU SYSTÈME │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ CLIENT 1 │ │ CLIENT 2 │ │ CLIENT N │
│ (Machine A) │ │ (Machine B) │ │ (Machine C) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
│ HELLO / REPORT / BYE │ │
▼ ▼ ▼
════════════════════════════════════════════════════════════════
RÉSEAU TCP/IP
Port: 65432
════════════════════════════════════════════════════════════════
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────────────────────────────┐
│ SERVEUR │
│ ┌────────────┐ ┌────────────┐ ┌────────────────────────┐ │
│ │ Accepte │→ │ Traite │→ │ Stocke en base │ │
│ │ connexions │ │ messages │ │ de données │ │
│ └────────────┘ └────────────┘ └────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ BASE DE DONNÉES SQLite │
│ ┌─────────────────────┐ ┌─────────────────────────────┐ │
│ │ Table: agents │ │ Table: metrics │ │
│ │ - agent_id (PK) │ │ - id (PK) │ │
│ │ - hostname │ │ - agent_id (FK) │ │
│ │ - first_seen │ │ - timestamp │ │
│ │ - last_seen │ │ - cpu_percent │ │
│ │ - active │ │ - ram_mb │ │
│ └─────────────────────┘ └─────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ RAPPORTS │ │INTERFACE │ │ LOGS │
│ JSON/ │ │ GRAPHIQUE│ │ │
│ CSV/HTML │ │ (GUI) │ │ │
└──────────┘ └──────────┘ └──────────┘
1. CLIENT → Connecte au serveur
2. CLIENT → Envoie "HELLO agent_id hostname"
3. SERVEUR → Répond "OK", enregistre l'agent
4. CLIENT → Toutes les 5 secondes: "REPORT agent_id timestamp cpu ram"
5. SERVEUR → Répond "OK", stocke les données
6. CLIENT → Ctrl+C → Envoie "BYE agent_id"
7. SERVEUR → Répond "OK", ferme la connexion
- Python 3.7+ installé
- Aucun module externe requis (bibliothèque standard uniquement)
# Naviguer vers le dossier du projet
ouvrir le terminal dans le dossier du projet
# Lancer le serveur
python main.py serverSortie attendue :
================================================================
TELEINFO MONITORING SERVER
================================================================
IP: 0.0.0.0
Port: 65432
Database: C:\Users\*********\********\Desktop\teleinfo\data\teleinfo.db
================================================================
Ctrl+C pour arreter
2026-04-09 19:35:44 - INFO - Serveur demarre sur 0.0.0.0:65432
Ouvrir un nouveau terminal :
cd C:\Users\DELL 5420\OneDrive\Desktop\teleinfo
python main.py clientSortie attendue :
================================================================
TELEINFO MONITORING CLIENT
================================================================
Agent ID: agent_default
Hostname: DELL5420
Serveur: 127.0.0.1:65432
Periode: 5s
================================================================
[19:35:45] Connecte au serveur 127.0.0.1:65432
[19:35:45] CPU: 45.2% | RAM: 2048.0 MB
[19:35:50] CPU: 52.1% | RAM: 2100.0 MB
[19:35:55] CPU: 38.7% | RAM: 1980.0 MB
Ouvrir un troisième terminal :
python main.py guipython main.py reportsChoisir :
1- Rapport résumé2- Rapport détaillé par agent3- Rapport comparatif4- Rapport d'alertes5- Exporter en CSV6- Générer tous les rapports
Le système utilise un protocole texte simple sur TCP/IP pour la communication client-serveur.
CLIENT → SERVEUR: HELLO <agent_id> <hostname>\n
SERVEUR → CLIENT: OK\n
Exemple :
CLIENT → SERVEUR: HELLO agent_001 MON-PC\n
SERVEUR → CLIENT: OK\n
CLIENT → SERVEUR: REPORT <agent_id> <timestamp> <cpu_percent> <ram_mb>\n
SERVEUR → CLIENT: OK\n
Exemple :
CLIENT → SERVEUR: REPORT agent_001 1712679345 45.23 2048.5\n
SERVEUR → CLIENT: OK\n
Description des champs :
| Champ | Type | Description |
|---|---|---|
| agent_id | string | Identifiant unique de l'agent |
| timestamp | integer | Unix timestamp (secondes depuis 1970) |
| cpu_percent | float | Pourcentage d'utilisation CPU (0-100) |
| ram_mb | float | Mémoire RAM utilisée en Mo |
CLIENT → SERVEUR: BYE <agent_id>\n
SERVEUR → CLIENT: OK\n
Exemple :
CLIENT → SERVEUR: BYE agent_001\n
SERVEUR → CLIENT: OK\n
Client Serveur Base de Données
│ │ │
│── HELLO ──────>│ │
│ │── register_agent()─>│
│<── OK ─────────│ │
│ │ │
│── REPORT ──────>│ │
│ │── insert_metric()──>│
│<── OK ─────────│ │
│ │ │
│ (répète toutes les 5s) │
│ │ │
│── BYE ─────────>│ │
│ │ │
│<── OK ─────────│ │
┌─────────────────┐ ┌─────────────────┐
│ agents │ │ metrics │
├─────────────────┤ ├─────────────────┤
│ id (PK) │──┐ │ id (PK) │
│ agent_id (UK) │ │ │ agent_id (FK) │──┐
│ hostname │ └───────│ timestamp │ │
│ first_seen │ │ cpu_percent │ │
│ last_seen │ │ ram_mb │ │
│ active │ │ recorded_at │ │
└─────────────────┘ └─────────────────┘ │
│
référence vers
agents.agent_id
CREATE TABLE agents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
agent_id TEXT UNIQUE NOT NULL, -- ID unique de l'agent
hostname TEXT, -- Nom de la machine
first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Première connexion
last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Dernière connexion
active INTEGER DEFAULT 1 -- 1=connecté, 0=déconnecté
);CREATE TABLE metrics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
agent_id TEXT NOT NULL, -- Référence à l'agent
timestamp INTEGER NOT NULL, -- Unix timestamp
cpu_percent REAL, -- % CPU (0-100)
ram_mb REAL, -- RAM en Mo
recorded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Date d'enregistrement
FOREIGN KEY (agent_id) REFERENCES agents(agent_id)
);CREATE INDEX idx_metrics_agent_time ON metrics(agent_id, timestamp);Cet index optimise les requêtes filtrant par agent et période.
teleinfo/
│
├── main.py # Point d'entrée - Menu principal
├── config.py # Configuration centralisée
├── server.py # Serveur TCP (récepteur)
├── client.py # Client de monitoring (émetteur)
├── database.py # Module SQLite
├── reports.py # Générateur de rapports
├── gui.py # Interface graphique Tkinter
├── stress_test.py # Module de stress test (simulation d'attaque)
│
├── data/ # Données (créé automatiquement)
│ └── teleinfo.db # Base de données SQLite
│
├── reports/ # Rapports générés (créé automatiquement)
│ ├── report_*.json
│ ├── report_*.html
│ └── metrics_*.csv
│
├── logs/ # Fichiers de logs (créé automatiquement)
│ └── server.log
│
├── requirements.txt # (vide - pas de dépendances)
└── .gitignore
Rôle : Menu principal permettant de choisir le module à exécuter
Fonctions :
- print_banner() : Affiche l'en-tête
- print_menu() : Affiche le menu
- run_server() : Lance le serveur
- run_client() : Lance le client
- run_gui() : Lance l'interface graphique
- run_reports() : Lance le générateur de rapports
- run_stress() : Lance le stress test
- init_database() : Initialise la base de données
- edit_config() : Affiche la configuration
Rôle : Gestion centralisée de la configuration
Paramètres configurables :
- server.host : Adresse IP d'écoute (défaut: 0.0.0.0)
- server.port : Port TCP (défaut: 65432)
- client.server_ip : IP du serveur (défaut: 127.0.0.1)
- client.period : Intervalle d'envoi (défaut: 5 secondes)
- database.retention_days : Conservation des données (défaut: 30 jours)
Rôle : Accepte les connexions et reçoit les métriques
Classes :
- TeleinfoServer : Gestionnaire principal du serveur
Fonctions principales :
- handle_client(conn, addr) : Gère la communication avec un client
- status_thread() : Tâche de fond (nettoyage, statistiques)
- start() : Démarre le serveur
- stop() : Arrête le serveur proprement
Rôle : Collecte et envoie les métriques système
Classes :
- TeleinfoClient : Gestionnaire principal du client
Fonctions principales :
- get_system_metrics() : Récupère CPU et RAM
- connect() : Établit la connexion TCP
- send_report() : Envoie les métriques
- disconnect() : Ferme proprement la connexion
Rôle : Interface avec SQLite pour stocker et récupérer les données
Classes :
- Database : Gestionnaire de base de données
Méthodes principales :
- register_agent(agent_id, hostname) : Enregistre un nouvel agent
- insert_metric(agent_id, timestamp, cpu, ram) : Ajoute une métrique
- get_metrics(agent_id, start_time, end_time) : Récupère les métriques
- get_agents(active_only) : Liste les agents
- get_statistics(hours) : Calcule les statistiques
- cleanup_old_data(days) : Supprime les anciennes données
- export_to_json/csv() : Exporte les données
Rôle : Crée des rapports dans différents formats
Classes :
- ReportGenerator : Générateur de rapports
Méthodes principales :
- generate_summary_report(hours) : Rapport global
- generate_detailed_report(agent_id) : Rapport par agent
- generate_comparison_report(agent_ids) : Comparaison d'agents
- generate_alert_report() : Détection d'anomalies
- generate_html_report() : Rapport HTML stylisé
- save_report_json/csv/html() : Sauvegarde
Rôle : Simule une chargemassive pour tester la robustesse du serveur
Classes :
- StressTest : Gestionnaire de stress test
Modes disponibles :
- burst : Envoie un nombre fixe de rapports
- flood : Envoie le maximum possible (sans délai)
- continuous : Envoie pendant une durée définie
- multi : Lance plusieurs threads simultanés
Fonctions principales :
- run_burst() : Mode burst avec compteur
- run_flood() : Mode flood sans délai
- run_continuous() : Mode continu avec stats temps réel
- run_multi_threaded() : Mode multi-threads
- print_stats() : Affiche les statistiques finales
Métriques mesurées :
- Nombre de rapports envoyés
- Taux de réussite (%)
- Temps de réponse moyen/min/max (ms)
- Débit moyen (msg/s)
- Durée totale du test
{
"report_type": "summary",
"generated_at": "2026-04-09T19:40:00.000000",
"period_hours": 24,
"active_agents": 2,
"statistics": [
{
"agent_id": "agent_default",
"sample_count": 288,
"avg_cpu": 45.2,
"max_cpu": 85.5,
"min_cpu": 12.3,
"avg_ram": 2048.5,
"max_ram": 4096.0,
"min_ram": 1024.0
}
],
"agents_detail": [
{
"agent_id": "agent_default",
"hostname": "DELL5420",
"first_seen": "2026-04-09 19:30:00",
"last_seen": "2026-04-09 19:40:00",
"status": "active"
}
]
}id,agent_id,timestamp,cpu_percent,ram_mb,recorded_at
1,agent_default,1712679345,45.23,2048.5,2026-04-09 19:35:45
2,agent_default,1712679350,52.10,2100.0,2026-04-09 19:35:50
3,agent_default,1712679355,38.70,1980.0,2026-04-09 19:35:55Ouvrez le fichier .html dans un navigateur pour voir :
- Tableau de bord avec cartes statistiques colorées
- Liste des agents avec statut (actif/inactif)
- Statistiques (moyenne, min, max) par agent
Le fichier config.json (créé automatiquement) contient :
{
"server": {
"host": "0.0.0.0",
"port": 65432,
"max_connections": 10,
"buffer_size": 4096
},
"client": {
"server_ip": "127.0.0.1",
"server_port": 65432,
"period": 5,
"agent_id": "agent_default",
"retry_delay": 3,
"max_retries": 5
},
"database": {
"path": "data/teleinfo.db",
"retention_days": 30
},
"reports": {
"output_dir": "reports",
"format": "json"
}
}Éditez le fichier config.json et redémarrez l'application.
- Terminal 1 :
python main.py server - Terminal 2 :
python main.py client - Attendre 1-2 minutes
- Terminal 3 :
python main.py reports→ Choisir6(tous les rapports)
- Sur la machine serveur :
python main.py server - Sur chaque machine cliente : Modifier
config.json:"client": { "server_ip": "192.168.1.100" // IP du serveur }
- Lancer
python main.py clientsur chaque machine
- Lancer le serveur
- Lancer un ou plusieurs clients
- Lancer
python main.py gui - Observer les métriques en temps réel
- Cliquer sur "Générer Rapport" pour créer un rapport HTML
- Terminal 1 :
python main.py server - Attendre que le serveur soit prêt
- Terminal 2 :
python main.py stress --mode burst --count 5000 - Observer les statistiques de performance
- Analyser les résultats (temps de réponse, débit)
- Client : Ctrl+C (envoie automatiquement BYE)
- Serveur : Ctrl+C (ferme toutes les connexions)
Cette section permet de tester la robustesse du serveur en envoyant un grand volume de requêtes.
Le module stress_test.py simule différents scénarios de charge pour évaluer les performances du serveur :
| Mode | Description | Cas d'usage |
|---|---|---|
| burst | Envoie un nombre fixe de rapports | Test de charge ponctuelle |
| flood | Envoie le maximum possible | Test de résistance maximale |
| continuous | Envoie pendant une durée définie | Test de stabilité |
| multi | Lance plusieurs threads simultanés | Test de concurrences multiples |
python main.py
# Choisir [5] STRESS TESTpython main.py stress [OPTIONS]| Option | Description | Défaut |
|---|---|---|
--mode |
Mode de test (burst/continuous/flood/multi) | burst |
--count |
Nombre de rapports à envoyer (mode burst) | 1000 |
--duration |
Durée du test en secondes | 30 |
--threads |
Nombre de threads (mode multi) | 5 |
--delay |
Délai entre chaque envoi (secondes) | 0 |
--agent |
ID personnalisé pour l'agent | auto |
Envoie un nombre fixe de rapports le plus rapidement possible.
python main.py stress --mode burst --count 5000Exemple de sortie :
==================================================
STRESS TEST - MODE BURST
==================================================
Nombre de rapports: 5000
Cible: 127.0.0.1:65432
==================================================
Progression: 100/5000 (980 msg/s)
Progression: 200/5000 (975 msg/s)
Progression: 300/5000 (982 msg/s)
...
==================================================
RAPPORT DE STRESS TEST
==================================================
Agent: stress_1234
Duree: 5.12 secondes
---------------------------
Envoye: 5000
Echoue: 0
Taux de reussite: 100.0%
---------------------------
Vitesse moyenne: 976.5 msg/s
---------------------------
Temps de reponse moyen: 1.02ms
Temps de reponse min: 0.45ms
Temps de reponse max: 15.32ms
==================================================
Envoie le maximum de requêtes possibles sans délai.
python main.py stress --mode flood --duration 60Objectif : Trouver la limite de traitement du serveur.
==================================================
FLOOD ATTACK SIMULATION
==================================================
Mode: ENVOI MASSIF SANS DELAI
Duree: 60 secondes
Cible: 127.0.0.1:65432
==================================================
[19:40:00] Flood: 500 @ 950 msg/s
[19:40:05] Flood: 1200 @ 980 msg/s
[19:40:10] Flood: 2100 @ 975 msg/s
...
[19:41:00] Flood: 58000 @ 967 msg/s
==================================================
RAPPORT DE STRESS TEST
==================================================
Envoye: 58000
Vitesse moyenne: 966.7 msg/s
Taux de reussite: 99.8%
==================================================
Envoie des métriques pendant une durée définie avec stats en temps réel.
python main.py stress --mode continuous --duration 120Objectif : Vérifier que le serveur reste stable sur une longue période.
Lance plusieurs threads simultanés pour simuler plusieurs clients.
python main.py stress --mode multi --threads 10 --duration 60Objectif : Tester la gestion de multiples connexions simultanées.
==================================================
STRESS TEST - MULTI-THREADED
==================================================
Threads: 10
Duree: 60 secondes
==================================================
[Thread-0] Termine: 5800 envois
[Thread-1] Termine: 5750 envois
[Thread-2] Termine: 5820 envois
...
[Thread-9] Termine: 5790 envois
Total: ~58000 rapports en 60 secondes
# Test rapide (1000 rapports)
python main.py stress
# Test moyen (10000 rapports)
python main.py stress --mode burst --count 10000
# Flood 30 secondes
python main.py stress --mode flood --duration 30
# 5 clients simultanés pendant 1 minute
python main.py stress --mode multi --threads 5 --duration 60
# Test avec délai entre chaque envoi
python main.py stress --mode burst --count 500 --delay 0.01┌─────────────────────────────────────────────────────────────┐
│ STRESS TEST WORKFLOW │
└─────────────────────────────────────────────────────────────┘
┌──────────────────┐
│ Choix du MODE │
│ burst/continuous │
│ flood/multi │
└────────┬─────────┘
│
┌──────────────────┼──────────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Burst │ │ Flood │ │ Multi │
│ N msgs │ │ Max │ │ N threads│
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└─────────────────┼─────────────────┘
│
▼
┌───────────────┐
│ Connexion TCP │
│ au Serveur │
└───────┬───────┘
│
▼
┌───────────────┐
│ HELLO + REPORT│
│ (boucle) │
└───────┬───────┘
│
▼
┌───────────────┐
│ Mesure des │
│ Performances │
│ - Temps reponse│
│ - Debit │
│ - Taux erreur │
└───────┬───────┘
│
▼
┌───────────────┐
│ BYE + Stats │
│ Finales │
└───────────────┘
| Métrique | Bon | Moyen | Mauvais |
|---|---|---|---|
| Taux de réussite | > 99% | 95-99% | < 95% |
| Temps de réponse moyen | < 5ms | 5-20ms | > 20ms |
| Débit (msg/s) | > 500 | 100-500 | < 100 |
- Votre propre serveur de test
- Un environnement isolé
- Avec l'accord du propriétaire du système
2026-04-09 19:35:44,926 - INFO - Serveur demarre sur 0.0.0.0:65432
2026-04-09 19:35:45,123 - INFO - Connexion de ('127.0.0.1', 54321)
2026-04-09 19:35:45,124 - INFO - Recu de ('127.0.0.1', 54321): HELLO agent_default DELL5420
2026-04-09 19:35:45,125 - INFO - Agent enregistre: agent_default (DELL5420)
2026-04-09 19:35:50,234 - INFO - Recu de ('127.0.0.1', 54321): REPORT agent_default 1712679350 45.23 2048.5
2026-04-09 19:35:55,345 - INFO - Recu de ('127.0.0.1', 54321): REPORT agent_default 1712679355 52.10 2100.0
2026-04-09 19:36:00,456 - INFO - Recu de ('127.0.0.1', 54321): REPORT agent_default 1712679360 38.70 1980.0
2026-04-09 19:36:05,567 - INFO - === Status ===
2026-04-09 19:36:05,568 - INFO - Agents actifs: 1
2026-04-09 19:36:05,569 - INFO - - agent_default (DELL5420)
[19:35:45] Connecte au serveur 127.0.0.1:65432
[19:35:45] Rapport envoye: CPU=45.23% RAM=2048.5MB
[19:35:50] Rapport envoye: CPU=52.10% RAM=2100.0MB
[19:35:55] Rapport envoye: CPU=38.70% RAM=1980.0MB
^C
[19:36:10] Arret en cours...
========================================
STATISTIQUES CLIENT agent_default
========================================
Uptime: 25s
Rapports envoyes: 5
Echecs: 0
Taux de succes: 100.0%
========================================
==================================================
STRESS TEST - MODE BURST
==================================================
Nombre de rapports: 1000
Cible: 127.0.0.1:65432
==================================================
Progression: 100/1000 (950 msg/s)
Progression: 200/1000 (975 msg/s)
Progression: 300/1000 (980 msg/s)
==================================================
RAPPORT DE STRESS TEST
==================================================
Agent: stress_5678
Duree: 1.03 secondes
---------------------------
Envoye: 1000
Echoue: 0
Taux de reussite: 100.0%
---------------------------
Vitesse moyenne: 970.9 msg/s
---------------------------
Temps de reponse moyen: 1.03ms
Temps de reponse min: 0.42ms
Temps de reponse max: 8.75ms
==================================================
C:\Users\DELL 5420\OneDrive\Desktop\teleinfo\reports\
├── report_summary_20260409_194000.json # Rapport JSON
├── report_summary_20260409_194000.html # Rapport HTML
├── report_detailed_agent_default_20260409_194000.json
├── report_alerts_20260409_194000.json
└── metrics_all_20260409_194000.csv # Export CSV
R: Vérifiez que :
- Le serveur est lancé
- L'adresse IP et le port sont corrects dans
config.json - Le pare-feu autorise les connexions sur le port 65432
R: Modifiez config.json :
"client": {
"period": 10 // 10 secondes au lieu de 5
}R:
- Automatiquement : Le serveur nettoie toutes les 30 secondes
- Manuellement : Lancez
python main.py reports→ option pour nettoyer
R: Lancez client.py sur chaque machine avec la même IP serveur
R: Non, il utilise uniquement la bibliothèque standard Python
R: Modifier le code de reports.py pour passer le paramètre hours :
report = generator.generate_summary_report(hours=48) # 48 heures-- Voir tous les agents
SELECT * FROM agents;
-- Voir les dernières métriques
SELECT * FROM metrics ORDER BY timestamp DESC LIMIT 10;
-- Statistiques par agent
SELECT agent_id, AVG(cpu_percent), AVG(ram_mb)
FROM metrics
GROUP BY agent_id;
-- Métriques d'un agent sur 24h
SELECT * FROM metrics
WHERE agent_id = 'agent_default'
AND timestamp > strftime('%s', 'now', '-1 day');# Vérifier si le port est ouvert
netstat -an | findstr 65432
# Tester la connexion
telnet 127.0.0.1 65432Ce projet a été développé dans le cadre d'un TP de Téléinformatique pour démontrer :
- Communication TCP/IP : Utilisation des sockets Python
- Protocole Applicatif : Définition d'un protocole simple texte
- Base de données : Stockage et interrogation avec SQLite
- Architecture Client-Serveur : Séparation des rôles
- Traitement Multithread : Gestion de multiples connexions simultanées
- Génération de Rapports : Export de données dans multiples formats
- Interface Graphique : GUI basique avec Tkinter
- Tests de Performance : Simulation d'attaque et stress testing
Projet développé dans le cadre du cours de Téléinformatique.
Version : 1.0
Date : Avril 2026
Bonne utilisation du système Teleinfo Monitor !