Programmation réseau Python


Python offre deux niveaux d'accès aux services réseau. :

  • Le service réseau de bas niveau prend en charge Socket de base, qui fournit l'API BSD Sockets standard et peut accéder à toutes les méthodes de l'interface Socket du système d'exploitation sous-jacent.

  • Module de service réseau de haut niveau SocketServer, qui fournit des classes de centre serveur pour simplifier le développement de serveurs réseau.


Qu'est-ce que Socket ?

Socket est également appelé « socket ». Les applications envoient généralement des requêtes ou répondent au réseau via « socket ». Les requêtes permettent la communication. entre hôtes ou entre processus sur un ordinateur.


Fonction socket()

En Python, nous utilisons la fonction socket() pour créer un socket Le format de syntaxe est le suivant :

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

Paramètres<. 🎜>

  • famille : La famille de sockets peut être de type AF_UNIX ou AF_INET

  • type : Le type de socket peut être divisé en orienté connexion ou sans connexion

    ou SOCK_STREAMSOCK_DGRAM

  • protocole : Généralement laissé vide, la valeur par défaut est 0.

Méthode d'objet Socket (intégrée)

FonctionDescription
Socket côté serveur
s.bind()Lier l'adresse (hôte, port) au socket, dans AF_INET ci-dessous, l'adresse est exprimée sous la forme d'un tuple (hôte, port).
s.listen()Démarrez l'écoute TCP. Le backlog spécifie le nombre maximum de connexions que le système d'exploitation peut suspendre avant de rejeter la connexion. Cette valeur doit être d'au moins 1 et 5 conviendra à la plupart des applications.
s.accept() Accepter passivement les connexions client TCP, (bloquant) en attendant l'arrivée de la connexion
Le socket client
s.connect() initialise activement la connexion au serveur TCP. Généralement, le format de l'adresse est un tuple (nom d'hôte, port). Si une erreur de connexion se produit, une erreur socket.error est renvoyée.
s.connect_ex()Une version étendue de la fonction connect() qui renvoie un code d'erreur lorsqu'une erreur se produit au lieu de lever une exception
Fonction socket à usage public
s.recv()Reçoit les données TCP, les données sont renvoyées sous forme de chaîne, bufsize spécifie la quantité maximale de données. flag fournit des informations supplémentaires sur le message et peut généralement être ignoré.
s.send()Envoyer des données TCP, en envoyant les données sous forme de chaîne au socket connecté. La valeur de retour est le nombre d'octets à envoyer, qui peut être inférieur à la taille en octets de la chaîne.
s.sendall()Envoyer complètement les données TCP, envoyer complètement les données TCP. Envoie les données dans une chaîne au socket connecté, mais tente d'envoyer toutes les données avant de revenir. Renvoie Aucun en cas de succès, lève une exception en cas d'échec.
s.recvform()Reçoit des données UDP, similaires à recv(), mais la valeur de retour est (données, adresse). Où data est une chaîne contenant les données reçues et adresse est l'adresse du socket à laquelle les données sont envoyées.
s.sendto()Envoyer des données UDP au socket, l'adresse 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()Fermez le socket
s.getpeername() Retours l'adresse distante de la prise de connexion. La valeur de retour est généralement un tuple (ipaddr, port).
s.getsockname()Renvoie la propre adresse du socket. Généralement un tuple de (ipaddr,port)
s.setsockopt(level,optname,value)Définissez la valeur de l'option de socket donnée.
s.getsockopt(level,optname[.buflen])Renvoie la valeur de l'option socket.
s.settimeout(timeout)Définit le délai d'attente pour les opérations de socket. Le délai d'attente est un nombre à virgule flottante en secondes. La valeur Aucun signifie qu’il n’y a pas de délai d’attente. Généralement, les délais d'attente doivent être définis lors de la première création du socket, car ils peuvent être utilisés pour les opérations de connexion (telles que connect())
s.gettimeout()Renvoie la valeur du délai d'expiration actuel en secondes, ou Aucun si aucun délai d'expiration n'est défini.
s.fileno()Renvoie le descripteur de fichier du socket.
s.setblocking(flag)Si l'indicateur est 0, définissez le socket en mode non bloquant, sinon définissez le socket en mode bloquant (valeur par défaut). En mode non bloquant, si aucune donnée n'est trouvée en appelant recv(), ou si l'appel send() ne peut pas envoyer de données immédiatement, une exception socket.error sera provoquée.
s.makefile()Crée un fichier associé au socket

Exemple simple

Serveur

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

Nous pouvons maintenant spécifier le port(port) du service en appelant la fonction bind(hostname, port).

Ensuite, nous appelons la méthode accept de l'objet socket. Cette méthode attend la connexion du client et renvoie un objet connection, indiquant qu'elle est connectée au client.

Le code complet est le suivant :

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:server.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口
s.bind((host, port))        # 绑定端口

s.listen(5)                 # 等待客户端连接
while True:
    c, addr = s.accept()     # 建立客户端连接。
    print '连接地址:', addr
    c.send('欢迎访问php中文网!')
    c.close()                # 关闭连接

Client

Ensuite, nous écrivons une instance client simple pour nous connecter au service créé ci-dessus. Le numéro de port est 12345. La méthode

socket.connect(hosname, port) ouvre une connexion TCP au fournisseur de services avec l'hôte hostname et le port port. Après la connexion, nous pouvons publier des données depuis le serveur. N'oubliez pas que la connexion doit être fermée une fois l'opération terminée.

Le code complet est le suivant :

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:client.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口好

s.connect((host, port))
print s.recv(1024)
s.close()

Maintenant, nous ouvrons deux terminaux, et le premier terminal exécute le fichier server.py :

$ python server.py

Le deuxième terminal exécute le client Fichier .py :

$ python client.py 
欢迎访问php中文网!

C'est le premier terminal que nous ouvrons à nouveau, et vous verrez la sortie d'informations suivante :

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

Module Internet Python

Ce qui suit est répertorié Quelques modules importants de la programmation réseau Python :

ProtocoleUtilisation de la fonctionNuméro de portModule Python
协议功能用处端口号Python 模块
HTTP网页访问80httplib, urllib, xmlrpclib
NNTP阅读和张贴新闻文章,俗称为"帖子"119nntplib
FTP文件传输20ftplib, urllib
SMTP发送邮件25smtplib
POP3接收邮件110poplib
IMAP4获取邮件143imaplib
Telnet命令行23telnetlib
Gopher信息查找70gopherlib, urllib

HTTP
<🎜>Accès Web<🎜><🎜>80<🎜><🎜>httplib, urllib, xmlrpclib<🎜><🎜><🎜><🎜>NNTP<🎜><🎜>Lire et publier des actualités articles, Communément appelés « posts »<🎜><🎜>119<🎜><🎜>nntplib<🎜><🎜><🎜><🎜>FTP<🎜><🎜>Transfert de fichiers<🎜><🎜>20 <🎜> <🎜>ftplib, urllib<🎜><🎜><🎜><🎜>SMTP<🎜><🎜>Envoyer un mail<🎜><🎜>25<🎜><🎜>smtplib<🎜><🎜> <🎜> <🎜>POP3<🎜><🎜>Recevoir le courrier<🎜><🎜>110<🎜><🎜>poplib<🎜><🎜><🎜><🎜>IMAP4<🎜><🎜>Recevoir le courrier <🎜> <🎜>143<🎜><🎜>imaplib<🎜><🎜><🎜><🎜>Telnet<🎜><🎜>Ligne de commande<🎜><🎜>23<🎜><🎜>telnetlib< 🎜>< 🎜><🎜><🎜>Gopher<🎜><🎜>Recherche d'informations<🎜><🎜>70<🎜><🎜>gopherlib, urllib<🎜><🎜><🎜><🎜><🎜 >Plus Pour plus d'informations, veuillez vous référer à la bibliothèque et aux modules Python Socket sur le site officiel. <🎜><🎜>