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é.")
Pour tester en classe
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…
Concepts cachés
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é.")
Test complet
1. Lancer d’abord serveur_simple.py
2. Sur l’autre ordinateur, lancer client_simple.py
3. Taper un message côté client
4. Observer ce qui s’affiche côté serveur et côté client.
Pour les plus jeunes (6–5ᵉ)
• 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()
Idées de défis
  • ✅ 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).
Pour NSI / avancés
  • 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é

  1. Q1. Dans notre activité, qui doit être lancé en premier ? A. le client   B. le serveur   C. peu importe   D. aucun
  2. 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.
  3. Q3. Que renvoie accept() ? A. Une seule chaîne de caractères. B. Deux objets : une nouvelle connexion et l’adresse du client. C. Toujours True. D. Une liste de messages.
  4. 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.
  5. 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

Posts les plus consultés de ce blog

Basthon.fr

mBot2 - programmation mBlock/python

Mario Kart 2D