Python sockets
Connexion entre 2 ordinateurs avec Python et les sockets
Objectif : comprendre comment deux ordinateurs peuvent “se parler” sur un réseau grâce à Python 🐍 et au module socket.
Niveau recommandé : 2nde NSI / début L1 – mais adaptable 6ᵉ → Terminale
🧑🎓 Pour les élèves
À la fin de cette activité, tu sauras :
- ce qu’est une adresse IP et un port,
- la différence entre un serveur et un client,
- comment écrire un petit serveur en Python,
- comment un autre ordinateur peut s’y connecter et envoyer un message.
On peut tester :
- sur 2 ordinateurs du même réseau (idéal),
- ou sur un seul ordinateur, en ouvrant 2 fenêtres de terminal (mode “simulation”).
🧑🏫 Pour les enseignants
Notions travaillées :
- modèle client–serveur, IP, port, socket TCP,
- flux d’octets, encodage UTF-8, côté bloquant de
accept()/recv(), - structure minimale d’un serveur TCP séquentiel,
- extension possible vers NSI : multi-clients, threads, protocole applicatif simple.
Activité inspirée / prolongeant le cours : info.blaisepascal.fr/nsi-sockets-python
1) Serveur minimal : “j’écoute sur un port”Côté serveur
On commence par un serveur tout simple : il attend qu’un client se connecte, reçoit un message, l’affiche, puis se ferme.
💡 Pour les plus jeunes : on peut présenter le serveur comme une “boîte aux lettres” qui attend une lettre (un message).
# fichier : serveur_simple.py
import socket
# 1. Création de la socket (IPv4, TCP)
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. Associer la socket à une adresse IP et un port
# '' = toutes les interfaces réseau de la machine
HOST = ""
PORT = 5000
serveur.bind((HOST, PORT))
# 3. Mise en mode "écoute"
serveur.listen(1) # 1 = nombre max de connexions en attente
print(f"Serveur en attente sur le port {PORT}...")
# 4. Attendre une connexion (appel bloquant)
connexion, adresse_client = serveur.accept()
print("Connexion d'un client :", adresse_client)
# 5. Recevoir des données (max 1024 octets)
donnees = connexion.recv(1024)
message = donnees.decode("utf-8")
print("Message reçu :", message)
# 6. Répondre au client
reponse = "Bonjour, j'ai bien reçu : " + message
connexion.send(reponse.encode("utf-8"))
# 7. Fermer la connexion
connexion.close()
serveur.close()
print("Serveur fermé.")
1. Sauvegarder ce code dans
serveur_simple.py
2. Ouvrir un terminal sur la machine “serveur”
3. Lancer : python serveur_simple.py
4. Attendre le client…
•
AF_INET = IPv4•
SOCK_STREAM = TCP (flux fiable)•
bind fixe le port (ici 5000)
• accept() bloque jusqu’à l’arrivée d’un client.
2) Client minimal : “je me connecte et j’envoie un message”Côté client
Le client connaît l’adresse IP du serveur et son port. Il se connecte, envoie un message texte, attend la réponse, puis se ferme.
# fichier : client_simple.py
import socket
# ⚠️ Remplacer par l'adresse IP de la machine serveur
# Exemple en local sur la même machine : "127.0.0.1"
HOST = "127.0.0.1"
PORT = 5000
# 1. Création de la socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. Connexion au serveur
print(f"Connexion à {HOST}:{PORT} ...")
client.connect((HOST, PORT))
# 3. Envoyer un message
texte = input("Message à envoyer au serveur : ")
client.send(texte.encode("utf-8"))
# 4. Recevoir la réponse
donnees = client.recv(1024)
reponse = donnees.decode("utf-8")
print("Réponse du serveur :", reponse)
# 5. Fermer la connexion
client.close()
print("Client terminé.")
1. Lancer d’abord
serveur_simple.py2. Sur l’autre ordinateur, lancer
client_simple.py3. Taper un message côté client
4. Observer ce qui s’affiche côté serveur et côté client.
• Imposer un message fixe dans le code (sans
input())• Demander simplement : “Que se passe-t-il si je relance le client ?”
3) Aller plus loin : mini chat (ping-pong)Optionnel
On peut transformer l’exemple en mini “chat” texte : le client envoie un message, le serveur répond, et on recommence plusieurs fois.
🔁 Version simple : on boucle côté serveur pour recevoir plusieurs messages du même client.
# fichier : serveur_chat.py
import socket
HOST = ""
PORT = 5000
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serveur.bind((HOST, PORT))
serveur.listen(1)
print(f"Serveur chat en attente sur le port {PORT}...")
connexion, adresse_client = serveur.accept()
print("Client connecté :", adresse_client)
while True:
donnees = connexion.recv(1024)
if not donnees:
print("Client déconnecté.")
break
message = donnees.decode("utf-8")
print("Client :", message)
if message.lower() in ("quit", "exit", "bye"):
connexion.send("Au revoir 👋".encode("utf-8"))
break
# réponse tapée par le prof / l'élève au clavier
reponse = input("Serveur (à envoyer) : ")
connexion.send(reponse.encode("utf-8"))
connexion.close()
serveur.close()
- ✅ Ajouter un message d’accueil envoyé automatiquement par le serveur.
- ✅ Afficher l’adresse du client dans chaque ligne de log.
- ✅ Limiter la taille du message (maximum 50 caractères).
- Thread par client (serveur multi-clients).
- Protocole applicatif simple :
LOGIN pseudo,MSG texte… - Afficher la file des clients connectés.
4) Comprendre IP & port – mini fiche mémoThéorie “light”
Avant ou après les tests, prendre 5 minutes pour clarifier quelques mots-clés :
- Adresse IP : “numéro” de la machine sur le réseau (ex : 192.168.1.12).
- Port : “porte” ou “canal” sur cette machine (ex : 5000 pour notre serveur).
- Socket : combinaison “IP + port” + protocole (TCP ici) qui permet de créer un canal de communication.
- Serveur : attend les connexions, répond aux demandes.
- Client : prend l’initiative, se connecte au serveur.
Pour les plus jeunes, on peut utiliser l’analogie :
“La maison = l’ordinateur (IP), la porte = le port, la lettre = le message.”
🧠 Mini-QCM de fin d’activité
- Q1. Dans notre activité, qui doit être lancé en premier ? A. le client B. le serveur C. peu importe D. aucun
-
Q2. Que fait la fonction
bind((HOST, PORT))? A. Elle envoie un message au client. B. Elle associe la socket à une adresse IP et un port. C. Elle ferme la connexion. D. Elle change de protocole. -
Q3. Que renvoie
accept()? A. Une seule chaîne de caractères. B. Deux objets : une nouvelle connexion et l’adresse du client. C. ToujoursTrue. D. Une liste de messages. - Q4. Pourquoi encode-t-on le texte en UTF-8 avant d’envoyer ? A. Pour transformer le texte en octets transmissibles. B. Pour le rendre illisible. C. Pour augmenter la vitesse de la connexion. D. Pour changer d’adresse IP.
- Q5. Sur un même réseau, que doit absolument connaître le client ? A. Le port du routeur Wi-Fi. B. L’adresse e-mail du professeur. C. L’adresse IP du serveur et son port. D. Le mot de passe de la box.
💬 Corrigé suggéré : Q1-B · Q2-B · Q3-B · Q4-A · Q5-C
Commentaires
Enregistrer un commentaire