9.11. Objets socket¶
L’interface Python avec la couche de transport est la classe socket.socket. Un socket représente une extrémité d’une conversation réseau – une adresse, un port et le protocole (UDP ou TCP) sur lequel se déroule la conversation. Les chapitres sur le contrôle matériel ouvraient des instances UART pour communiquer sur un fil ; cette section ouvre des instances socket pour communiquer sur le réseau. La forme est la même ; le service sous-jacent est simplement beaucoup plus capable.
9.11.1. Création d’un socket¶
Trois arguments décrivent un socket : quelle famille d’adresses il parle, quel type de socket il offre et quel protocole il utilise. Les valeurs par défaut couvrent les cas qu’utilise le reste de cette section
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # IPv4 TCP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # IPv4 UDP
Les deux constantes parmi lesquelles l’application choisit dans presque tous les cas :
AF_INET– adresses IPv4 (une IP numérique plus un port). Le choix le plus courant.AF_INET6est l’équivalent IPv6.SOCK_STREAM– une connexion TCP, le flux d’octets fiable.SOCK_DGRAMest l’équivalent UDP.
Le troisième argument (le protocole) est laissé à zéro, ce qui sélectionne la bonne valeur par défaut en fonction des deux premiers. Le constructeur complet est documenté sur socket — module socket.
9.11.2. Les adresses sur un socket¶
Une adresse de socket est un tuple (host, port)
("192.168.1.50", 80)
("0.0.0.0", 8000)
Le host est l’adresse IP sous forme de chaîne. Le port est l’entier de 16 bits abordé sur Ports.
Une poignée de chaînes host spéciales méritent d’être connues :
"0.0.0.0"signifie « toutes les interfaces IPv4 de cet appareil ». Un serveur lié à cette adresse accepte les connexions sur n’importe quelle adresse que détient la caméra."127.0.0.1"est localhost – le trafic qui lui est destiné ne quitte jamais l’appareil. Utile pour les tests."255.255.255.255"est l’adresse de diffusion locale. Un datagramme UDP qui lui est envoyé va vers tous les appareils du segment local.
Les noms de domaine comme "example.com" ne sont pas des chaînes host valides dans une adresse de socket. Ils doivent d’abord être résolus en une IP ; Noms et DNS couvre l’appel getaddrinfo() qui le fait.
9.11.3. Les deux rôles¶
Le cycle de vie d’un socket dépend du côté de la conversation où il se trouve. Un socket client appelle connect() (ou, pour UDP, simplement sendto()) pour communiquer avec un serveur connu. Un socket serveur appelle bind() pour revendiquer un port, puis soit listen() et accept() (pour TCP), soit recvfrom() (pour UDP) pour recevoir le trafic entrant.
Le même constructeur socket est utilisé dans les deux cas ; seules les méthodes appelées ensuite diffèrent. Les trois pages suivantes parcourent les modèles pratiques :
Sockets UDP – envoyer et recevoir des datagrammes.
Sockets TCP – client et serveur TCP.
Sockets avec asyncio – tout ce qui précède, mais à l’intérieur d’une boucle d’événements
asyncio.
9.11.4. Fermeture d’un socket¶
Chaque socket détient un petit morceau d’état du système d’exploitation (une réservation de port, des tampons, l’état TCP de la connexion). Lorsque l’application en a terminé avec lui, close() libère cet état. Un socket oublié est une fuite lente qui s’accumule ; dans une boucle qui ouvre des connexions, oublier un close finira par épuiser le pool de sockets disponibles de la caméra.
Le modèle le plus propre est l’instruction with
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(addr)
s.send(b"GET / HTTP/1.0\r\n\r\n")
...
# socket is closed automatically here, even on error
Les sockets implémentent le protocole de gestionnaire de contexte abordé dans la vue d’ensemble de Python, de sorte que le bloc with garantit que close() est appelé, que le bloc se termine normalement ou par la levée d’une exception.
9.11.5. La référence socket¶
Cette page et les suivantes parcourent l’API sous forme narrative. Pour la référence complète, au niveau des arguments, de chaque méthode, de chaque drapeau et de chaque constante que le module expose, voir socket — module socket. La référence est aussi l’endroit où chercher les opérations moins courantes (options de socket, appartenance à un groupe multicast, identifiants de portée IPv6) que cette section ne couvre pas.