Maison >développement back-end >Tutoriel Python >Pourquoi mon socket Python ne reçoit-il pas de données après le premier appel « recv() » à moins que je modifie le client ?
Problème :
La méthode socket.recv() de Python ne renvoie pas données lorsqu'il est appelé une deuxième fois après avoir modifié le code du serveur d'écho pour éviter de renvoyer des données au client.
Analyse :
Les sockets TCP fonctionnent comme des flux de données, sans corrélation un à un entre les appels d'envoi et de réception. Le code initial adhérait à un protocole spécifique dans lequel le serveur renvoyait exactement ce qu'il avait reçu jusqu'à ce que le client ferme la connexion.
La modification a modifié les règles, obligeant le serveur à recevoir et à rejeter continuellement des données sans répondre jusqu'à ce que le client fermé leur extrémité. Le client, attendant une réponse immédiate, se bloque indéfiniment.
Solution :
Pour résoudre ce problème, le client doit ajuster son comportement pour correspondre au protocole du serveur modifié.
Modification du client :
Fermer le côté sortant du socket pour signaler l’achèvement, permettant au serveur d’envoyer la réponse. Implémentez plusieurs opérations recv() pour gérer la fragmentation potentielle des données.
import socket HOST = 'localhost' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(b'Hello, world') s.shutdown(socket.SHUT_WR) data = b'' while True: buf = s.recv(1024) if not buf: break data += buf s.close() print('Received', repr(data))
Code serveur mis à jour :
Maintenir le protocole modifié, en envoyant "ok" une fois le client ferme leur connexion entrante.
import socket HOST = '' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(b'ok') conn.shutdown(socket.SHUT_WR) conn.close()
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!