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 !

Python - Socket Programming

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