Que sont les sockets en Python et comment ils fonctionnent
Un socket est une interface logicielle qui permet une communication bidirectionnelle entre deux nœuds d'un réseau informatique. C'est une prise virtuelle à travers laquelle les applications peuvent envoyer et recevoir des données sur le réseau.
Les applications réseau modernes utilisent activement les sockets Python pour créer divers systèmes. Des messageries instantanées aux jeux en ligne et aux services d'échange de données — partout, l'interaction réseau passe par les sockets.
Concepts fondamentaux de la programmation réseau
Pour travailler avec les sockets en Python, il est essentiel de comprendre les concepts clés suivants :
- Adresse IP — l'adresse unique d'un périphérique sur le réseau
- Port — un identifiant numérique d'un service sur un périphérique
- TCP (Transmission Control Protocol) — un protocole fiable de transmission de données
- UDP (User Datagram Protocol) — un protocole rapide sans accusé de réception
TCP garantit une livraison fiable des données avec contrôle des erreurs. UDP est plus rapide mais ne garantit pas la livraison des messages.
Configuration et importation de la bibliothèque socket
Le module socket fait partie de la bibliothèque standard de Python. Pour commencer à travailler avec les sockets, il suffit d'importer le module :
import socket
Aucune installation supplémentaire n'est nécessaire. La bibliothèque socket est disponible par défaut dans toutes les versions de Python.
Création d'un serveur TCP en Python
Implémentation de base du serveur
Un serveur TCP accepte les connexions des clients et traite leurs requêtes. Voici une implémentation simple :
import socket
# Création d'un socket TCP
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Liaison à une adresse et un port
server_socket.bind(('localhost', 12345))
# Début de l'écoute (maximum 5 connexions en file d'attente)
server_socket.listen(5)
print("Serveur démarré. Attente de connexions...")
while True:
# Acceptation de la connexion
client_socket, address = server_socket.accept()
print(f"Connexion depuis {address}")
# Réception du message
message = client_socket.recv(1024).decode('utf-8')
print(f"Message reçu : {message}")
# Envoi de la réponse
client_socket.send("Bonjour du serveur !".encode('utf-8'))
# Fermeture de la connexion avec le client
client_socket.close()
Comprendre le fonctionnement du serveur
Dans le code ci-dessus, les opérations suivantes se déroulent :
- Un socket est créé en utilisant le protocole TCP
- Le serveur se lie à l'adresse localhost et au port 12345
- L'écoute des connexions client est lancée
- Lorsqu'un client se connecte, son message est reçu
- Le serveur envoie une réponse et ferme la connexion
La méthode socket.AF_INET indique l'utilisation d'IPv4, et socket.SOCK_STREAM celle du protocole TCP.
Développement d'un client TCP
Un client TCP se connecte au serveur et échange des données avec lui. Exemple d'implémentation du client :
import socket
# Création du socket client
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connexion au serveur
client_socket.connect(('localhost', 12345))
# Envoi du message
client_socket.send("Bonjour, serveur !".encode('utf-8'))
# Réception de la réponse
response = client_socket.recv(1024).decode('utf-8')
print(f"Réponse du serveur : {response}")
# Fermeture de la connexion
client_socket.close()
Le client exécute une séquence d'actions : connexion, envoi de données, réception de la réponse et fermeture de la connexion.
Travailler avec le protocole UDP
UDP offre un moyen plus rapide de transmettre des données sans garantie de livraison. Cela le rend adapté aux applications en temps réel.
Serveur UDP
Blogs
OAuth 2.0 et autorisation JWT en Kotlin : guide étape par étape
C++ pour l'apprentissage automatique : possibilités pratiques et limites
GetHashCode et Equals : pourquoi leur redéfinition est cruciale en C#
Book Recommendations
Lire aussi
Travailler avec les bases de données en C++ : PostgreSQL et MongoDB pour débutants
Rust pour la programmation système : pourquoi un développeur Python devrait y jeter un œil
Files d'attente de tâches en Rust : guide pratique avec exemples de code
Déploiement PHP sans interruption : guide zero-downtime
Cycle d'importation non autorisé en Go : comment briser le cercle vicieux