Aller au contenu

Les sockets en Python

Pour les projets ou pour d'autres situations, il est parfois utile d'établir une communication entre deux applications, cette page détaille les étapes d’une communication client-serveur en Python utilisant des sockets TCP.

Chaque primitive réseau est expliquée à partir des exemples fournis.

Tcp

Une communication TCP repose sur deux rĂ´les :

  • Serveur : attend une connexion entrante.
  • Client : initie la connexion vers le serveur.

Le protocole TCP garantit une communication fiable, ordonnée et orientée connexion.


Serveur : étapes détaillées⚓︎

Python
import socket

def listen_connect():
    socket_ecoute = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket_ecoute.bind(('', 1042)) # demande au système d'exploitation que le port 1042 soit relié au code Python
    socket_ecoute.listen()
    socket_client, (adr_client, port_client) = socket_ecoute.accept()
    print(f"connexion établie avec le client à l'adresse: {adr_client} et port:{port_client}")
    message = socket_client.recv(1024)
    print(message.decode("utf-8"))
    socket_client.close()


if __name__ == "__main__":
    listen_connect()

1. socket.socket()⚓︎

Python
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • CrĂ©ation de la socket
  • AF_INET : utilise IPv4
  • SOCK_STREAM : utilise TCP (connexion fiable)

2. bind()⚓︎

Python
socket_ecoute.bind(('', 1042))
  • Associe la socket Ă  une adresse IP + port
  • '' : signifie "toutes les interfaces rĂ©seau disponibles"
  • 1042 : port d’écoute

Le système d’exploitation réserve ce port pour ce programme. Pour les applications qui sont lancés sans les privilèges admin, seuls les ports supérieurs à 1024 sont autorisés par le système.


3. listen()⚓︎

Python
socket_ecoute.listen()
  • Met la socket en mode Ă©coute
  • Le serveur est prĂŞt Ă  accepter des connexions

Une file d’attente interne est créée pour stocker les demandes entrantes.


4. accept()⚓︎

Python
socket_client = socket_ecoute.accept()
  • Bloque jusqu’à ce qu’un client se connecte
  • Retourne un tuple :

  • socket_client : nouvelle socket dĂ©diĂ©e Ă  la communication avec ce client

  • (adr_client, port_client) : adresse du client (IP, port)

Important : une nouvelle socket : socket_client est créée pour dialoguer avec le client.


5. recv()⚓︎

Python
message = socket_client[0].recv(1024)
  • Reçoit des donnĂ©es depuis le client
  • 1024 : taille maximale en octets

Les données reçues sont de type bytes. C'est à dire qu'elles ne sont pas directement interprétées comme des caractères dans un jeu de caractère (sauf pour l'ASCII), pour les caractères accentués il faut utiliser encode et decode.


6. Traitement du message⚓︎

Python
print(message.decode("utf-8"))
  • Conversion des bytes en chaĂ®ne de caractères

7. close()⚓︎

Python
socket_client.close()
  • Ferme la connexion avec le client Libère les ressources rĂ©seau.

Client : étapes détaillées⚓︎

Python
import socket

def connect():
    socket_connect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket_connect.connect(('localhost', 1042))
    bytes_message = "đź‘‹ Bonjour le serveur !đź‘‹".encode("utf8")
    socket_connect.send(bytes_message)
    socket_connect.close()

if __name__ == "__main__":
    connect()

1. socket.socket()⚓︎

Python
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • CrĂ©ation de la socket client
  • MĂŞme paramètres que le serveur (IPv4 + TCP)

2. connect()⚓︎

Python
socket_connect.connect(('localhost', 1042))
  • Tente de se connecter au serveur
  • 'localhost' : machine locale
  • 1042 : port cible

Cette étape déclenche la poignée de main TCP (TCP handshake).


3. send()⚓︎

Python
socket_connect.send(bytes_message)
  • Envoie des donnĂ©es au serveur
  • Les donnĂ©es doivent ĂŞtre en bytes

Ici, on encode une chaîne avec UTF-8 :

Python
"đź‘‹ Bonjour le serveur !đź‘‹".encode("utf8")

4. close()⚓︎

Python
socket_connect.close()
  • Ferme la connexion cĂ´tĂ© client

🔄 Résumé du flux de communication⚓︎

  1. Le serveur :

  2. crée une socket

  3. bind sur un port
  4. écoute (listen)
  5. attend une connexion (accept)

  6. Le client :

  7. crée une socket

  8. se connecte (connect)

  9. Échange :

  10. client envoie (send)

  11. serveur reçoit (recv)

  12. Fermeture :

  13. client et serveur ferment leur socket (close)


Ce code est à adapter pour des situations avec plusieurs échanges entres deux applications, ou pour des échanges entre plus de deux applications.