Problem:
Pythons socket.recv()-Methode gibt nicht zurück Daten, wenn nach der Bearbeitung des Echo-Servercodes ein zweites Mal aufgerufen wird, um das Zurücksenden von Daten an den zu vermeiden Client.
Analyse:
TCP-Sockets fungieren als Datenströme, es fehlt eine Eins-zu-Eins-Korrelation zwischen Sende- und Empfangsaufrufen. Der ursprüngliche Code folgte einem bestimmten Protokoll, bei dem der Server genau das zurücksendete, was er empfangen hatte, bis der Client die Verbindung schloss.
Durch die Änderung wurden die Regeln geändert, sodass der Server kontinuierlich Daten empfing und verwarf, ohne bis zum Client zu antworten schloss ihr Ende. Der Client bleibt auf unbestimmte Zeit hängen, da er eine sofortige Antwort erwartet.
Lösung:
Um dieses Problem zu beheben, muss der Client sein Verhalten an das geänderte Serverprotokoll anpassen.
Kunde Änderung:
Schließen Sie die Ausgangsseite des Sockets, um den Abschluss zu signalisieren, sodass der Server die Antwort senden kann. Implementieren Sie mehrere recv()-Operationen, um potenzielle Datenfragmentierung zu bewältigen.
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))
Aktualisierter Servercode:
Behalten Sie das geänderte Protokoll bei und senden Sie „ok“, sobald der Client geschlossen wird ihre eingehende Verbindung.
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()
Das obige ist der detaillierte Inhalt vonWarum empfängt mein Python-Socket nach dem ersten „recv()'-Aufruf keine Daten, es sei denn, ich ändere den Client?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!