Heim >Backend-Entwicklung >Python-Tutorial >Warum empfängt mein Python-Socket keine Daten, ohne sie zu senden?

Warum empfängt mein Python-Socket keine Daten, ohne sie zu senden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-30 18:59:12496Durchsuche

Why Doesn't My Python Socket Receive Data Without Sending?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn