Heim > Backend-Entwicklung > Python-Tutorial > Warum führt das Entfernen von Datenechos von einem Python-Socket-Server dazu, dass „socket.recv()' bei nachfolgenden Aufrufen nichts zurückgibt?

Warum führt das Entfernen von Datenechos von einem Python-Socket-Server dazu, dass „socket.recv()' bei nachfolgenden Aufrufen nichts zurückgibt?

Mary-Kate Olsen
Freigeben: 2024-11-27 03:37:22
Original
924 Leute haben es durchsucht

Why Does Removing Data Echoing from a Python Socket Server Cause `socket.recv()` to Return Nothing on Subsequent Calls?

Python Socket: Die Auswirkungen des Datenrückgabeverhaltens verstehen

Anfangs funktionierte ein Python-Echoserver-Beispiel aus der offiziellen Dokumentation einwandfrei. Bei der Änderung des Codes, um das Zurücksenden von Daten an den Client zu verhindern, trat jedoch ein Problem auf. Der zweite Aufruf der Methode socket.recv() ergab keine Rückgabe.

Unterschiedliche Implementierung, unterschiedliche Ergebnisse

Der ursprüngliche Code aus der Dokumentation verwendete eine While-Schleife, die:

conn.sendall(data)

Diese Zeile implizierte, dass der Server dies tun würde Geben Sie die empfangenen Daten an den Client zurück, bis der Client das Ende der Verbindung geschlossen hat.

Im geänderten Code änderte sich das Verhalten wie folgt:

break

Wenn die Methode conn.recv(1024) zum zweiten Mal aufgerufen wurde, wurde sie sofort beendet, sodass keine Daten mehr verfügbar waren Client.

Die Natur von TCP-Streams

Um dieses Verhalten zu verstehen, ist es wichtig, die Natur von TCP-Streams zu verstehen. Sie übertragen Daten in einem kontinuierlichen Fluss, ohne direkte Korrelation zwischen Client- und Servervorgängen. Darüber hinaus bestimmt das Protokoll die zugrunde liegenden Kommunikationsregeln.

Im Originalcode schrieb das Protokoll vor, dass der Server jedes empfangene Datenpaket so lange wiederholt, bis der Client seine ausgehende Verbindung schließt. Beim Schließen würde der Server seinen Socket schließen.

Geänderte Protokoll- und Client-Anpassungen

Der geänderte Code führte ein neues Protokoll ein, bei dem der Server eingehende Daten bis zum Client verwirft hat seine ausgehende Verbindung geschlossen. Anschließend sendete der Server „ok“ und schloss seinen Socket.

Damit der Client mit diesem neuen Protokoll funktioniert, war Folgendes erforderlich:

  1. Die ausgehende Verbindung des Clients schließen Geben Sie den Abschluss an.
  2. Implementieren Sie mehrere recv()-Aufrufe, um einer möglichen Fragmentierung der Daten Rechnung zu tragen Übertragung.

Aktualisierter Server und Client

Die folgenden aktualisierten Codebeispiele veranschaulichen die überarbeitete Protokollimplementierung:

Server:

import socket</p>
<p>HOST = ''<br>PORT = 50007 <br>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br>s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)<br>s.bind((HOST, PORT))<br> s.listen(1)</p>
<p>conn, addr = s.accept()<br>print('Connected by', addr)</p>
<p>while True:</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">data = conn.recv(1024)
if not data: break
Nach dem Login kopieren
Nach dem Login kopieren

conn.sendall(b'ok')
conn.shutdown(socket.SHUT_WR)
conn.close()

Client:

import socket</p>
<p>HOST = 'localhost'<br>PORT = 50007<br>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br>s.connect((HOST, PORT))<br>s.sendall (b'Hallo, world')<br>s.shutdown(socket.SHUT_WR)<br>data = b''<br>while True:</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">data = conn.recv(1024)
if not data: break
Nach dem Login kopieren
Nach dem Login kopieren

s.close()
print('Received' , repr(data))

Mit diesen überarbeiteten Implementierungen ist der Server Verwirft eingehende Daten effizient, sodass der Client seine Antwort nach dem Schließen erhalten kann.

Das obige ist der detaillierte Inhalt vonWarum führt das Entfernen von Datenechos von einem Python-Socket-Server dazu, dass „socket.recv()' bei nachfolgenden Aufrufen nichts zurückgibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Vorheriger Artikel:Wie kann Scipy dabei helfen, die am besten passende theoretische Verteilung für empirische Daten zu ermitteln? Nächster Artikel:Wie kann ich eine verschachtelte Liste in Python effizient deduplizieren?
Erklärung dieser Website
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
Neueste Artikel des Autors
Aktuelle Ausgaben
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage