Heim > Backend-Entwicklung > Python-Tutorial > Warum empfängt mein Python-Socket nach dem ersten „recv()'-Aufruf keine Daten, es sei denn, ich ändere den Client?

Warum empfängt mein Python-Socket nach dem ersten „recv()'-Aufruf keine Daten, es sei denn, ich ändere den Client?

Susan Sarandon
Freigeben: 2024-11-28 20:10:16
Original
589 Leute haben es durchsucht

Why Doesn't My Python Socket Receive Data After the First `recv()` Call Unless I Modify the Client?

Python-Socket empfängt keine Daten ohne zu senden

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.

  • Aktualisierter Client-Code:
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))
Nach dem Login kopieren
  • 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()
Nach dem Login kopieren

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!

Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage