Premiers pas avec les sockets

Préambule Par rapport au cours de NSI

La notion de socket et la conception de serveurs en général n'est pas un attendu du programme de NSI. Il n'est demandé aux élèves « que » de comprendre le type des données qui transitent sur un réeseau et comment elles le font.
Mais dans le cadre des projets, être capable de monter un mini-serveur en Python peut se révéler utile. J'espère que ce cours répondra à cette attente.

Prérequis

On suppose compris la notion de Client/Serveur vue en cours et on va se contenter ici de produire un serveur local (sur un LAN)

Définition Socket

Un socket est ce qui sert d'interface entre l'application et les protocoles TCP/IP.

  • Il permet à l'application l'envoie et la réception de messages.
  • Il est définit par
    • Une adresse IP (sa propre adresse pour le serveur ou l'adresse du destinataire du message)
    • Un numéro de port (pour identifier le logiciel parmis les autres sur la machine)

« socket » peut se traduire par « prise » : c'est ce qui permet de « brancher » le logiciel au réseau.

Dans un script Python :

import socket

# On définit le type d'adresse et le mode de communication (TCP/IP):
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# On définit l'adresse de l'hôte et le port de communication :
serveur.bind(('localhost', 12800))

Protocole Étapes de la communication TCP

Serveur
Client
Création d'un socket serveur
Création d'un socket
Assignation d'un port
Attente d'un client
Connexion acceptée
Demande de connexion
Le serveur crée automatiquement un nouveau socket pour communiquer avec le client
Attente et réception
Envoie d'un message
Envoie d'un message
Attente et réception
On peut répéter ces opérations autant que l'on veut
Fermeture du socket client
Fermeture du socket
Fermeture du socket serveur

Script Python minimaliste pour un serveur

import socket

# Création d'un socket serveur
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Assignation d'un port
serveur.bind(('localhost', 12800))
# Attente d'un client
serveur.listen(5)
print("Le serveur en attente de client...")

# Connexion acceptée
client, infos = serveur.accept()
# Attente et réception
msg_recu = client.recv(1024)
print("Message reçu :",msg_recu.decode('utf8'))
# Envoie d'un message
client.send("5 / 5".encode('utf8'))

# Fermeture du socket client
client.close()
print("Client déconnecté.")
# Fermeture du socket serveur
serveur.close()
print("Serveur fermé.")

Script Python minimaliste pour le client correspondant

import socket

# Création d'un socket
connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Demande de connexion
connexion.connect(('localhost', 12800))
print("Connexion établie avec le serveur.")

# Envoie d'un message
msg_a_envoyer = input("> ").encode('utf8')
connexion.send(msg_a_envoyer)
# Attente et réception
msg_recu = connexion.recv(1024)
print(msg_recu.decode('utf8'))

# Fermeture du socket
connexion.close()