Cous Python 2 Programmation Sockets
Cous Python 2 Programmation Sockets
bind(), listen() et accept() sont spécifiques aux sockets serveur. connect() est
spécifique aux sockets client. send() et recv() sont communs aux deux types.
Voici un exemple de serveur TCP:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 9999))
s.listen(5)
conn, addr = s.accept()
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
conn.close()
Ici, nous créons un socket de serveur, le lions à localhost et un port
9999 et commençons à écouter les connexions entrantes.
Ensuite, nous avons utilisé s.listen(5) pour écouter. Ici, le « 5 »
représente le nombre de connexions entrantes que nous sommes prêts
à mettre en file d’attente avant d’en refuser.
Pour accepter une connexion entrante, nous appelons la méthode
accept() qui bloquera jusqu’à ce qu’un nouveau client se connecte.
Lorsque cela se produit, il crée un nouveau socket et le renvoie avec
l’adresse du client.
Ensuite, dans un boucle infini, il lit les données du socket par lots de
1024 octets en utilisant la méthode recv() jusqu’à ce qu’il retourne une
chaîne vide. Après cela, il renvoie toutes les données entrantes en
utilisant la méthode sendall() qui à l’intérieur appelle plusieurs fois la
méthode send(). Et après cela, il ferme simplement la connexion du
client.
Voici le code côté client TCP:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 9999))
s.sendall('Welcome to WayToLearnX!')
data = s.recv(1024)
s.close()
print repr(data), 'Reçue'
Ici, au lieu d’utiliser bind() et listen(), il appelle uniquement connect() et
envoie immédiatement des données au serveur. Il reçoit ensuite 1024
octets, ferme le socket et affiche les données reçues.
Socket UDP
Le protocole UDP fonctionne différemment de TCP/IP. TCP est un
protocole orienté flux, garantissant que toutes les données sont
transmises dans le bon ordre, UDP est un protocole orienté message.
UDP ne nécessite pas de connexion de longue durée, donc la
configuration d’un socket UDP est un peu plus simple. D’ailleurs, les
messages UDP doivent tenir dans un seul paquet (pour IPv4, cela
signifie qu’ils ne peuvent contenir que 65507 octets car le paquet de
65535 octets comprend également des informations d’en-tête) et la
livraison n’est pas garantie comme c’est le cas avec TCP.
Puisqu’il n’y a pas de connexion, le serveur n’a pas besoin d’écouter et
d’accepter les connexions. Il a seulement besoin d’utiliser bind() pour
associer son socket à un port, puis attendre les messages.
Les messages sont lus à partir du socket à l’aide de recvfrom(), qui
renvoie les données ainsi que l’adresse du client à partir duquel elles
ont été envoyées.
Voici un exemple de serveur UDP:
import socket
msg = str.encode("Hello Client!")
# Créer une socket datagramme
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Lier à l'adresse IP et le port
s.bind(("127.0.0.1", 9999))
print("Serveur UDP à l'écoute")
# Écoutez les datagrammes entrants
while(True):
addr = s.recvfrom(1024)
message = addr[0]
address = addr[1]
clientMsg = "Message du client: {}".format(message)
clientIP = "Adresse IP du client: {}".format(address)
print(clientMsg)
print(clientIP)
# Envoi d'une réponse au client
s.sendto(msg, address)
import socket
msg = str.encode("Hello Client!")
# Créer une socket datagramme
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Lier à l'adresse IP et le port
s.bind(("127.0.0.1", 9999))
print("Serveur UDP à l'écoute")
while(True):
addr = s.recvfrom(1024)
message = addr[0]
address = addr[1]
clientMsg = "Message du client: {}".format(message)
clientIP = "Adresse IP du client: {}".format(address)
print(clientMsg)
print(clientIP)
# Envoi d'une réponse au client
s.sendto(msg, address)
Voici le code côté client UDP:
import socket
msgClient = "Hello Server"
msgToSend = str.encode(msgClient)
addrPort = ("127.0.0.1", 9999)
bufferSize = 1024
# Créer un socket UDP coté client
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Envoyer au serveur à l'aide du socket UDP créé
s.sendto(msgToSend, addrPort)
msgServer = s.recvfrom(bufferSize)
msg = "Message du serveur {}".format(msgServer[0])
print(msg)
Références
https://docs.python.org/fr/3/howto/sockets.html
https://waytolearnx.com/2020/06/socket-tcp-client-serveur-avec-
python.html
https://waytolearnx.com/2020/06/socket-udp-client-serveur-avec-
python.html