Programmation réseau en Python

Python fournit des services réseau à deux niveaux d'accès :

  • Les services réseau de bas niveau prennent en charge les sockets de base, en fournissant l'API standard BSD Sockets, qui peut accéder à toutes les méthodes de l'interface Socket du système d'exploitation sous-jacent.
  • Le module de service réseau de haut niveau SocketServer fournit des classes centrées sur le serveur qui simplifient le développement de serveurs réseau.

Qu'est-ce qu'une socket ?

Une socket est aussi appelée « socket ». Les applications font généralement des requêtes au réseau ou répondent aux requêtes réseau via la « socket », ce qui permet la communication entre hôtes ou entre processus sur le même ordinateur.


Fonction socket()

En Python, nous utilisons la fonction socket() pour créer une socket. La syntaxe est la suivante :

socket.socket([family[, type[, proto]]])

Parameters

  • family : La famille de sockets peut être AF_UNIX ou AF_INET.
  • type : Le type de socket peut être divisé, selon qu'il est orienté connexion ou sans connexion, en :SOCK_STREAMouSOCK_DGRAM。
  • protocol : Généralement non renseigné ; la valeur par défaut est 0.

Méthodes (intégrées) de l'objet socket

Fonction Description
Sockets côté serveur
s.bind() Lie l'adresse (host, port) à la socket. Sous AF_INET, l'adresse est représentée sous la forme d'un tuple (host, port).
s.listen() Démarrer l'écoute TCP. backlog spécifie le nombre maximal de connexions que le système d'exploitation peut mettre en file d'attente avant de refuser les connexions. Cette valeur doit être au moins 1 ; pour la plupart des applications, la définir à 5 suffit.
s.accept() Accepter passivement les connexions client TCP, en attendant (de manière bloquante) que la connexion arrive.
Sockets côté client
s.connect() Initialiser activement une connexion à un serveur TCP. Généralement, address se présente sous la forme d'un tuple (hostname, port). Si la connexion échoue, une socket.error est renvoyée.
s.connect_ex() Une version étendue de la fonction connect() ; en cas d'erreur, elle renvoie un code d'erreur au lieu de lever une exception.
Fonctions de socket d'usage courant
s.recv() Recevoir des données TCP ; les données sont renvoyées sous forme de chaîne. bufsize spécifie la quantité maximale de données à recevoir. flag fournit des informations supplémentaires sur le message et peut généralement être ignoré.
s.send() Envoie des données TCP. Envoie les données contenues dans string au socket connecté. La valeur de retour est le nombre d'octets envoyés, qui peut être inférieur à la taille en octets de string.
s.sendall() Envoie intégralement des données TCP. Envoie les données contenues dans string au socket connecté, mais tente d'envoyer toutes les données avant de retourner. Renvoie None en cas de succès, ou lève une exception en cas d'échec.
s.recvfrom() Reçoit des données UDP, comme recv(), mais la valeur de retour est (data, address). data est une chaîne contenant les données reçues, et address est l'adresse du socket qui a envoyé les données.
s.sendto() Envoie des données UDP. Envoie data au socket ; address est un tuple de la forme (ipaddr, port), spécifiant l'adresse distante. La valeur de retour est le nombre d'octets envoyés.
s.close() Ferme le socket.
s.getpeername() Renvoie l'adresse distante du socket connecté. La valeur de retour est généralement un tuple (ipaddr, port).
s.getsockname() Renvoie l'adresse propre du socket. Généralement un tuple (ipaddr, port).
s.setsockopt(level,optname,value) Définit la valeur de l'option de socket donnée.
s.getsockopt(level,optname[.buflen]) Renvoie la valeur de l'option de socket.
s.settime(timeout) Définit le délai d'attente pour les opérations sur le socket. timeout est un float en secondes. Une valeur None signifie aucun délai d'attente. Généralement, le timeout doit être défini lors de la création initiale du socket, car il peut être utilisé pour les opérations de connexion (telles que connect()).
s.gettimeout() Renvoie la valeur actuelle du timeout en secondes ; si aucun délai d'attente n'est défini, renvoie None.
s.fileno() Renvoie le descripteur de fichier du socket.
s.setblocking(flag) Si flag vaut 0, mettez le socket en mode non bloquant ; sinon, mettez le socket en mode bloquant (par défaut). En mode non bloquant, si recv() ne trouve aucune donnée, ou si send() ne peut pas envoyer de données immédiatement, il lèvera une exception socket.error.
s.makefile() Créez un fichier associé à ce socket.

Exemple simple

Server

Nous utilisons la fonctionsocketdu module socket pour créer un objet socket. L'objet socket peut configurer un service socket en appelant d'autres fonctions.

Maintenant, nous pouvons appeler la fonctionbind(hostname, port)pour spécifier leport du service.。

Ensuite, nous appelons la méthodeacceptde l'objet socket. Cette méthode attend une connexion client et renvoie un objetconnection, indiquant qu'il est connecté au client.

Le code complet est le suivant :

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- # Nom du fichier : server.py import socket # Importer le module socket s = socket.socket() # Créer un objet socket host = socket.gethostname() # Obtenir le nom d'hôte local port = 12345 # Définir le port s.bind((host, port)) # Lier le port s.listen(5) # Attendre la connexion d'un client while True: c,addr = s.accept() # Établir la connexion client print 'Adresse de connexion :', addr c.send('Bienvenue sur Example !') c.close() # Fermer la connexion

Client

Ensuite, écrivons un exemple simple de client pour se connecter au service créé ci-dessus. Le numéro de port est 12345.

socket.connect(hostname, port )La méthode ouvre une connexion TCP vers l'hôtehostnameet le portportdu serveur. Une fois connecté, nous pouvons récupérer des données depuis le serveur. N'oubliez pas de fermer la connexion après la fin des opérations.

Le code complet est le suivant :

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- # Nom du fichier : client.py import socket # Importer le module socket s = socket.socket() # Créer un objet socket host = socket.gethostname() # Obtenir le nom d'hôte local port = 12345 # Définir le numéro de port s.connect((host, port)) print s.recv(1024) s.close()

Ouvrons maintenant deux terminaux. Dans le premier terminal, exécutez le fichier server.py :

$ python server.py

Dans le second terminal, exécutez le fichier client.py :

$ python client.py 
欢迎访问Example!

À ce stade, si nous ouvrons à nouveau le premier terminal, nous verrons la sortie suivante :

连接地址: ('192.168.0.118', 62461)

Modules Internet Python

Ce qui suit répertorie quelques modules importants pour la programmation réseau en Python :

ProtocolFonction/ObjectifNuméro de portModule Python
HTTPAccès Web80httplib, urllib, xmlrpclib
NNTPLire et publier des articles de news, communément appelés « posts ».119nntplib
FTPTransfert de fichiers20ftplib, urllib
SMTPEnvoyer un e-mail25smtplib
POP3Recevoir des e-mails110poplib
IMAP4Récupérer des e-mails143imaplib
TelnetLigne de commande23telnetlib
GopherRecherche d'informations70gopherlib, urllib

Pour plus d'informations, consultez labibliothèque et les modules Socket Python du site officiel。

Autres extensions.