Heim >Backend-Entwicklung >Python-Tutorial >Warum empfängt mein Python-Socket keine Daten, ohne sie zu senden?
Python-Socket empfängt nicht ohne zu senden
Diese Frage befasst sich mit einem Problem, bei dem ein modifiziertes Socket-Beispiel aus der Python-Dokumentation nach dem keine Daten empfängt Der anfängliche Versand wurde deaktiviert. Das Problem entsteht durch die inhärente Natur von TCP-Sockets, die Daten als kontinuierlichen Strom behandeln.
Im ursprünglichen Beispiel stellte die while-Schleife sicher, dass der Server jede empfangene Nachricht zurücksendete. Dadurch wurde ein einfaches Protokoll erstellt, bei dem das Senden eine Reaktion auslöste.
In der modifizierten Version führt jedoch das Entfernen der Echo-Funktionalität zu einer Störung des Protokolls. Der Server wird zu einem unendlichen Datenkonsumenten und wartet darauf, dass der Client die Verbindung schließt. Da das Senden deaktiviert ist, werden die Daten des Clients weder bestätigt noch zurückgesendet, was dazu führt, dass sie beim Warten auf eine Antwort hängen bleiben.
Die Lösung liegt darin, das Verhalten des Clients an das neue Protokoll anzupassen. Anstatt eine sofortige Antwort zu erwarten, sollte der Client das Ende der Verbindung ordnungsgemäß schließen. Dies signalisiert dem Server, dass das Senden der Daten abgeschlossen ist, und fordert den Server auf, die erwartete „OK“-Nachricht zu senden.
Um die Zuverlässigkeit zu erhöhen, kann der Client mehrere Recv-Aufrufe verwenden, um eine mögliche Datenfragmentierung zu bewältigen. Diese Änderung stellt sicher, dass auch segmentierte Nachrichten erfolgreich empfangen werden.
Aktualisierte Beispielcodes:
Server
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()
Client
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))
Durch die Befolgung dieser Änderungen stellt das Beispiel sicher, dass der Client nicht hängen bleibt und der Server ordnungsgemäß funktioniert den Datenaustausch, auch ohne sofortige Antwort vom Server.
Das obige ist der detaillierte Inhalt vonWarum empfängt mein Python-Socket keine Daten, ohne sie zu senden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!