python socket.recv / Sendall blocage d'appel
Question
Ce message est marqué « envoyer » mal depuis que je ne peux pas créer de nouvelles balises.
J'ai une question fondamentale sur ce simple serveur d'écho. Voici quelques extraits de code.
client
while True:
data = raw_input("Enter data: ")
mySock.sendall(data)
echoedData = mySock.recv(1024)
if not echoedData: break
print echoedData
serveur
while True:
print "Waiting for connection"
(clientSock, address) = serverSock.accept()
print "Entering read loop"
while True:
print "Waiting for data"
data = clientSock.recv(1024)
if not data: break
clientSock.send(data)
clientSock.close()
Maintenant, cela fonctionne bien, sauf si le client envoie une chaîne vide (en appuyant sur la touche de retour en réponse à « entrer des données: »)., Auquel cas je vois un comportement-ish de blocage
Maintenant, ce qui se passe exactement quand l'utilisateur appuie le retour sur le côté client? Je ne peux imaginer que les blocs d'appel Sendall attente pour certaines données à ajouter au tampon d'envoi, ce qui provoque l'appel recv pour bloquer à son tour. Que se passe t-il ici?
Merci d'avoir lu!
La solution
Plus, l'appel sendall()
ne fait rien (car il n'y a pas de données à envoyer), et donc l'appel recv()
sur le client blocs d'attente pour les données, mais puisque rien n'a été envoyé au serveur, la serveur envoie jamais de données en arrière car il est également bloqué sur sa recv()
initiale, et donc les deux processus sont bloqués.