Programmation réseau en Python3
Python fournit des services réseau à deux niveaux :
- Les services réseau de bas niveau prennent en charge les sockets de base, 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 peuvent simplifier le développement de serveurs réseau.
Qu'est-ce qu'une socket ?
Socket, également appelé « socket », est utilisé par les applications pour envoyer des requêtes au réseau ou répondre aux requêtes réseau, permettant 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 un socket, et 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 :
SOCK_STREAMouSOCK_DGRAM - proto : Généralement laissé vide, la valeur par défaut est 0.
Méthodes (intégrées) de l'objet socket
| Fonction | Description |
|---|---|
| Socket côté serveur | |
| s.bind() | Lie l'adresse (host, port) au socket. Sous AF_INET, l'adresse est représentée sous la forme d'un tuple (host, port). |
| s.listen() | Démarre 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, et pour la plupart des applications, la définir à 5 suffit. |
| s.accept() | Accepte passivement les connexions client TCP, (bloquant) en attendant l'arrivée de la connexion |
| Socket côté client | |
| s.connect() | Initialise activement une connexion à un serveur TCP. Généralement, le format de l'adresse est un tuple (hostname, port). Si la connexion échoue, un socket.error est renvoyé. |
| s.connect_ex() | Une version étendue de la fonction connect(), renvoie un code d'erreur en cas d'échec au lieu de lever une exception |
| Fonctions socket d'usage général | |
| s.recv() | Reçoit des données TCP, 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, en envoyant les données de la chaîne vers le socket connecté. La valeur de retour est le nombre d'octets envoyés, qui peut être inférieur à la taille en octets de la chaîne. |
| s.sendall() | Envoie complètement les données TCP. Envoie les données de la chaîne vers le socket connecté, mais tente d'envoyer toutes les données avant de retourner. Renvoie None en cas de succès, lève une exception en cas d'échec. |
| s.recvfrom() | Reçoit des données UDP, de manière similaire à recv(), mais la valeur de retour est (data, address). Ici, data est une chaîne contenant les données reçues, et address est l'adresse de socket depuis laquelle les données ont été envoyées. |
| s.sendto() | Envoie des données UDP, en envoyant les données à la socket. address est un tuple sous la forme (ipaddr, port) spécifiant l'adresse distante. La valeur de retour est le nombre d'octets envoyés. |
| s.close() | Ferme la socket |
| s.getpeername() | Renvoie l'adresse distante de la socket connectée. La valeur de retour est généralement un tuple (ipaddr, port). |
| s.getsockname() | Renvoie l'adresse propre de la 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 de socket. timeout est un nombre float en secondes. Une valeur None signifie aucun délai d'attente. Généralement, le délai d'attente doit être défini lorsque la socket vient d'être créée, car il peut être utilisé pour des opérations de connexion (telles que connect()) |
| s.gettimeout() | Renvoie la valeur actuelle du délai d'attente en secondes ; si aucun délai d'attente n'est défini, renvoie None. |
| s.fileno() | Renvoie le descripteur de fichier de la socket. |
| s.setblocking(flag) | Si flag est False, définit la socket en mode non bloquant ; sinon, définit la 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, une exception socket.error sera levée. |
| s.makefile() | Crée un fichier associé à cette 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 l'objet de connexion, indiquant qu'il s'est connecté au client.
Le code complet est le suivant :
Exemple
# Nom du fichier : server.py
# Importer les modules socket, sys
import socket
import sys
# Créer un objet socket
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# Obtenir le nom d'hôte local
host = socket.gethostname()
port = 9999
# Lier au numéro de port
serversocket.bind((host, port))
# Définir le nombre maximal de connexions ; au-delà, mise en file d'attente
serversocket.listen(5)
while True:
# Établir la connexion client
clientsocket,addr = serversocket.accept()
print("Adresse de connexion : %s" % str(addr))
msg='Bienvenue dans le tutoriel d'exemple !'+ "\r\n"
clientsocket.send(msg.encode('utf-8'))
clientsocket.close()
Client
Ensuite, écrivons un exemple de client simple pour se connecter au service créé ci-dessus. Le numéro de port est 9999.
socket.connect(hostname, port )méthode ouvre une connexion TCP vers l'hôtehostnameportportSe connecter au service. Après la connexion, nous pouvons obtenir des données depuis le serveur. N'oubliez pas que vous devez fermer la connexion une fois l'opération terminée.
Le code complet est le suivant :
Exemple
# Nom du fichier : client.py
# Importer les modules socket, sys
import socket
import sys
# Créer un objet socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Obtenir le nom d'hôte local
host = socket.gethostname()
# Définir le numéro de port
port = 9999
# Se connecter au service, en spécifiant l'hôte et le port
s.connect((host, port))
# Recevoir des données inférieures à 1024 octets
msg = s.recv(1024)
s.close()
print (msg.decode('utf-8'))
Ouvrons maintenant deux terminaux. Dans le premier terminal, exécutez le fichier server.py :
$ python3 server.py
Dans le second terminal, exécutez le fichier client.py :
$ python3 client.py 欢迎访问Example!
À ce stade, si nous ouvrons à nouveau le premier terminal, nous verrons la sortie d'informations suivante :
连接地址: ('192.168.0.118', 33397)
Modules Internet Python
Ce qui suit répertorie quelques modules importants pour la programmation réseau en Python :
| Protocol | Fonction/Objectif | Numéro de port | Module Python |
|---|---|---|---|
| HTTP | Accès Web | 80 | httplib, urllib, xmlrpclib |
| NNTP | Lire et publier des articles d'actualité, communément appelés « posts » | 119 | nntplib |
| FTP | Transfert de fichiers | 20 | ftplib, urllib |
| SMTP | Envoi d'e-mail | 25 | smtplib |
| POP3 | Réception d'e-mail | 110 | poplib |
| IMAP4 | Récupération d'e-mail | 143 | imaplib |
| Telnet | Ligne de commande | 23 | telnetlib |
| Gopher | Recherche d'informations | 70 | gopherlib, urllib |
Pour plus de contenu, veuillez vous référer au site officiel deBibliothèque et modules Socket Python。
Autres extensions