Python socket.recv / sendall Anrufblockierung
Frage
Dieser Beitrag ist falsch getaggt ‚Senden‘, da ich nicht neue Tags erstellen kann.
Ich habe eine sehr grundlegende Frage zu diesem einfachen Echo-Server. Hier sind einige Code-Schnipsel.
Client
while True:
data = raw_input("Enter data: ")
mySock.sendall(data)
echoedData = mySock.recv(1024)
if not echoedData: break
print echoedData
Server
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()
Jetzt das funktioniert gut, außer wenn der Kunde sendet eine leere Zeichenfolge (durch die Return-Taste als Antwort trifft auf „Daten eingeben:“). In diesem Fall ich einige Deadlock-ish Verhalten sehen
Nun, was genau passiert, wenn der Benutzer drückt auf der Client-Seite zurückkehren? Ich kann nur vorstellen, dass die sendall Aufruf blockiert warten auf einige Daten in den Sendepuffer hinzugefügt werden, die recv Anruf verursacht wiederum zu blockieren. Was ist hier los?
Vielen Dank für das Lesen!
Lösung
Ähnliche, der sendall()
Anruf nichts tut (da es keine Daten ist zu senden), und damit der recv()
Anruf auf den Client Warte Blöcke für Daten, aber da war nichts an den Server gesendet, die Server sendet nie Daten zurück, da sie auch auf seine ursprüngliche recv()
blockiert ist, und somit werden beide Prozesse blockiert.