Maison > Article > développement back-end > Comment Python implémente-t-il la communication UDP et TCP ?
UDP est un protocole de transmission sans connexion et peu fiable. Par rapport à TCP, UDP présente les avantages d'une vitesse de transmission de données rapide et d'un faible délai de transmission. Cependant, il ne garantit pas une transmission fiable des données et nécessite la couche d'application. retransmission, vérification et autres traitements.
Ce qui suit est un exemple de code d'envoi UDP simple :
import socket UDP_IP = '127.0.0.1' # 目标IP地址 UDP_PORT = 5005 # 目标端口号 MESSAGE = b"Hello, World!" # 要发送的数据 # 创建UDP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 发送数据 sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) # 关闭套接字 sock.close()
Ce qui suit est un exemple de code de réception UDP simple :
import socket UDP_IP = '127.0.0.1' # 监听IP地址 UDP_PORT = 5005 # 监听端口号 # 创建UDP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定套接字到指定IP地址和端口号 sock.bind((UDP_IP, UDP_PORT)) # 接收数据 data, addr = sock.recvfrom(1024) # 一次最多接收1024字节的数据 print("Received message:", data) # 关闭套接字 sock.close()
Il convient de noter que dans la communication UDP, en raison de la limite de taille du paquet de données, il peut être nécessaire pour Les données sont fragmentées et les données reçues doivent également être mises en cache et épissées pour garantir l'intégrité des données.
Dans les réseaux IPv4, la longueur maximale d'un paquet UDP est de 64 Ko (65 535 octets), ce qui inclut la taille de l'en-tête IP et de l'en-tête UDP. Dans les applications pratiques, en raison des limitations des équipements réseau et des systèmes d'exploitation, la taille des paquets UDP est généralement soumise à certaines restrictions. Par exemple, certains routeurs et pare-feu peuvent limiter la longueur maximale des paquets UDP, et certains systèmes d'exploitation peuvent également imposer certaines restrictions sur les paquets UDP.
Lorsque vous utilisez UDP pour la transmission de données, vous devez faire attention à la limite de taille des paquets de données et essayer d'éviter d'envoyer des paquets de données trop volumineux. Vous pouvez utiliser la méthode getsockopt() pour interroger la limite de taille des paquets UDP du système, par exemple :
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) max_size = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF) print(f"Max size of UDP packet: {max_size} bytes")
TCP est un protocole de transmission fiable et orienté connexion qui offre des garanties de fiabilité et d'intégrité pour la transmission de données, mais. l'efficacité de la transmission est relativement faible.
Ce qui suit est un exemple de code simple de serveur et de client TCP :
Serveur TCP :
import socket # 设置IP地址和端口号 IP = '127.0.0.1' PORT = 8888 # 创建TCP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端口号 sock.bind((IP, PORT)) # 开始监听 sock.listen(1) print(f"Server listening on {IP}:{PORT}...") # 接受客户端连接 conn, addr = sock.accept() print(f"Connected by {addr[0]}:{addr[1]}") # 接收数据 data = conn.recv(1024) print(f"Received data: {data.decode()}") # 发送数据 msg = b"Hello, Client!" conn.sendall(msg) # 关闭连接 conn.close()
Client TCP :
import socket # 设置IP地址和端口号 IP = '127.0.0.1' PORT = 8888 # 创建TCP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 sock.connect((IP, PORT)) # 发送数据 msg = b"Hello, Server!" sock.sendall(msg) # 接收数据 data = sock.recv(1024) print(f"Received data: {data.decode()}") # 关闭连接 sock.close()
Il convient de noter que dans la communication TCP, la transmission de données doit être effectuée via une connexion, donc le la connexion doit d'abord être établie, puis les données sont transférées et enfin la connexion est fermée. Étant donné que TCP est un protocole de transmission orienté connexion, il nécessite un processus d'établissement de connexion complexe tel qu'une négociation à trois. Il est moins efficace qu'UDP, mais présente une plus grande fiabilité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!