debuter_en_python:socket
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| debuter_en_python:socket [2026/10/13 18:17] – créée admin | debuter_en_python:socket [2026/10/13 20:49] (Version actuelle) – [pour le client] admin | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ======== Les sockets | + | ======== Les sockets |
| + | |||
| + | Un socket est un point de communication entre deux programmes. On peut le voir comme une prise réseau : un programme attend sur une adresse IP et un port, et un autre s’y connecte pour échanger des données. | ||
| + | |||
| + | Voici un exemple simple en TCP : le client envoie un message et le serveur lui renvoie le même message. TCP établit une connexion entre les deux programmes. En Python, le serveur crée une socket, l’associe à une adresse avec bind(), attend une connexion avec listen() et accept() ; le client se connecte avec connect(). | ||
| + | |||
| + | ====Pour le serveur==== | ||
| + | |||
| + | <code python fileserveur.py> | ||
| + | import socket | ||
| + | |||
| + | HOST = " | ||
| + | PORT = 50007 | ||
| + | |||
| + | with socket.socket(socket.AF_INET, | ||
| + | serveur.setsockopt(socket.SOL_SOCKET, | ||
| + | serveur.bind((HOST, | ||
| + | serveur.listen() | ||
| + | |||
| + | print(f" | ||
| + | |||
| + | while True: # accepte les connexions indéfiniment | ||
| + | connexion, adresse = serveur.accept() | ||
| + | print(" | ||
| + | |||
| + | with connexion: | ||
| + | # Utilise une ligne terminée par Entrée comme délimiteur de message | ||
| + | with connexion.makefile(" | ||
| + | for ligne in flux: | ||
| + | message = ligne.decode(" | ||
| + | print(" | ||
| + | |||
| + | if message.lower() == " | ||
| + | flux.write(" | ||
| + | flux.flush() | ||
| + | break | ||
| + | |||
| + | flux.write(f" | ||
| + | flux.flush() | ||
| + | |||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | ====pour le client==== | ||
| + | |||
| + | <code python fileclient.py> | ||
| + | import socket | ||
| + | |||
| + | HOST = " | ||
| + | PORT = 50007 | ||
| + | |||
| + | with socket.socket(socket.AF_INET, | ||
| + | client.connect((HOST, | ||
| + | |||
| + | with client.makefile(" | ||
| + | while True: | ||
| + | message = input(" | ||
| + | flux.write((message + " | ||
| + | flux.flush() | ||
| + | |||
| + | reponse = flux.readline() | ||
| + | if not reponse: | ||
| + | print(" | ||
| + | break | ||
| + | |||
| + | print(reponse.decode(" | ||
| + | |||
| + | if message.lower() == " | ||
| + | break | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | Lance d’abord le serveur dans un terminal avec python3 serveur.py, puis le client dans un autre avec python3 client.py. Le client se connecte à 127.0.0.1 — la machine locale — sur le port 50007. sendall() envoie les données, et recv(1024) lit jusqu’à 1024 octets. Les données échangées sont des octets : ici, .encode() et .decode() servent à convertir entre texte et octets. | ||
| + | |||
| + | Dans cet exemple, AF_INET indique IPv4 et SOCK_STREAM indique TCP. Une socket TCP est un flux d’octets : pour des échanges plus complexes, il faut définir un protocole pour savoir où chaque message commence et se termine. | ||
| + | |||
| + | Pour un Serveur permanent, il faut placer accept() dans une boucle infinie. Ainsi, le serveur continue d’attendre des connexions, y compris après le départ d’un client. Voici une version qui garde aussi la connexion avec un client ouverte pour échanger plusieurs messages. | ||
| + | |||
| + | Lance python3 fileserveur.py dans un terminal, puis python3 fileclient.py dans un autre terminal ou sur un autre pc . Le serveur continue de tourner après qu’un client a tapé " | ||
/home/chanteri/www/fablab37110/data/attic/debuter_en_python/socket.1791908228.txt.gz · Dernière modification : de admin
