Programmation Socket en Python
Bonjour à tous, futurs magiciens Python ! Aujourd'hui, nous plongeons dans le monde passionnant de la programmation des sockets. Ne vous inquiétez pas si vous êtes nouveaux dans ce domaine ; nous allons commencer par les bases et progresser pas à pas. D'ici la fin de ce tutoriel, vous serez en mesure de créer vos propres applications réseau comme un pro !
Qu'est-ce que les Sockets ?
Imaginez que vous essayez de parler à un ami qui vit loin. Vous avez besoin d'un moyen d'envoyer votre message et de recevoir leur réponse. Dans le monde des ordinateurs, les sockets jouent ce rôle. Ils sont comme les lignes téléphoniques qui permettent aux ordinateurs de communiquer entre eux sur un réseau.
Les sockets sont les points de terminaison d'un lien de communication bidirectionnel entre deux programmes exécutés sur un réseau. C'est ainsi que vous envoyez des messages entre un client (comme votre navigateur web) et un serveur (comme un site web).
Le Module socket
de Python
Python rend la programmation des sockets très simple avec son module intégré socket
. Commençons par l'importer :
import socket
Cette simple ligne nous donne accès à toutes les fonctionnalités des sockets dont nous avons besoin. C'est comme ouvrir notre boîte à outils avant de commencer à construire !
Méthodes des Sockets Serveur
Lorsque nous créons un serveur, nous devons utiliser des méthodes spécifiques pour le configurer. Voici un tableau des méthodes les plus courantes pour les sockets serveur :
Méthode | Description |
---|---|
socket() |
Crée un nouveau socket |
bind() |
Lie le socket à une adresse et un port spécifiques |
listen() |
Met le serveur en mode écoute |
accept() |
Accepte une connexion d'un client |
Voyons cela en action avec un exemple simple :
import socket
# Crée un objet socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Lie le socket à une adresse et un port spécifiques
server_socket.bind(('localhost', 12345))
# Écoute les connexions entrantes
server_socket.listen(1)
print("Le serveur écoute...")
# Accepte une connexion
client_socket, address = server_socket.accept()
print(f"Connexion de {address} a été établie !")
# Ferme la connexion
client_socket.close()
Dans cet exemple, nous créons un socket, le lie à 'localhost' sur le port 12345, commence à écouter, puis attend qu'un client se connecte. Lorsqu'une connexion est établie, nous affichons un message et puis fermons la connexion.
Méthodes des Sockets Client
Maintenant, regardons le côté client des choses. Voici les principales méthodes que nous utilisons lors de la création d'un client :
Méthode | Description |
---|---|
socket() |
Crée un nouveau socket |
connect() |
Se connecte à un socket distant à une adresse spécifiée |
send() |
Envoie des données au socket connecté |
recv() |
Reçoit des données du socket connecté |
Voici un exemple simple de client :
import socket
# Crée un objet socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Se connecte au serveur
client_socket.connect(('localhost', 12345))
print("Connecté au serveur !")
# Ferme la connexion
client_socket.close()
Ce client crée un socket, se connecte à notre serveur (qui devrait être en cours d'exécution), puis ferme la connexion.
Serveur Socket Python
Étions-nous notre exemple de serveur pour faire quelque chose d'utile :
import socket
def start_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("Le serveur écoute...")
while True:
client_socket, address = server_socket.accept()
print(f"Connexion de {address} a été établie !")
message = "Bienvenue sur le serveur !"
client_socket.send(message.encode())
client_socket.close()
start_server()
Ce serveur continuera de s'exécuter, acceptant les connexions, envoyant un message de bienvenue, puis fermant la connexion.
Client Socket Python
Maintenant, créons un client qui peut recevoir le message du serveur :
import socket
def start_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
message = client_socket.recv(1024).decode()
print(f"Message du serveur : {message}")
client_socket.close()
start_client()
Ce client se connecte à notre serveur, reçoit le message de bienvenue, l'affiche, puis ferme la connexion.
Transfert de Fichier avec le Module Socket
Une application pratique de la programmation des sockets est le transfert de fichiers. Voici un exemple simple de l'envoi d'un fichier du client au serveur :
Serveur :
import socket
def receive_file():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("Le serveur attend un fichier...")
client_socket, address = server_socket.accept()
print(f"Connexion de {address} a été établie !")
with open('received_file.txt', 'wb') as file:
while True:
data = client_socket.recv(1024)
if not data:
break
file.write(data)
print("Le fichier a été reçu avec succès !")
client_socket.close()
receive_file()
Client :
import socket
def send_file():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
with open('file_to_send.txt', 'rb') as file:
data = file.read(1024)
while data:
client_socket.send(data)
data = file.read(1024)
print("Le fichier a été envoyé avec succès !")
client_socket.close()
send_file()
Cet exemple montre comment envoyer un fichier du client au serveur à l'aide de sockets.
Le Module socketserver
de Python
Pour les applications serveur plus complexes, Python fournit le module socketserver
. Ce module simplifie le processus d'écriture des serveurs réseau. Voici un exemple simple :
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print(f"Reçu : {self.data.decode()}")
self.request.sendall("Message reçu".encode())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
print("Le serveur est en cours d'exécution...")
server.serve_forever()
Ce serveur utilise le module socketserver
pour créer un serveur TCP qui renvoie tout message qu'il reçoit.
Et voilà, les amis ! Nous avons couvert les bases de la programmation des sockets en Python, de la création de clients et de serveurs simples au transfert de fichiers et à l'utilisation du module socketserver
. Souvenez-vous, la pratique rend parfait, donc n'ayez pas peur d'expérimenter avec ces concepts. Bonne programmation !
Credits: Image by storyset