Seit kurzem verwende ich Python für die Netzwerk-Programmierung , um ein universelles Tcpclient-Test-Gadget zu entwickeln. Bei der Netzwerkprogrammierung mithilfe von Sockets ist die Frage, wie festgestellt werden kann, ob eine vom Peer gesendete Nachricht empfangen wurde, ein Problem, das bei der Entwicklung von Socket-Netzwerken berücksichtigt werden muss. Hier eine kurze Einführung in die drei häufig verwendeten Methoden zur Bestimmung des Abschlusses des Datenempfangs:
1. Grundlegende Datenempfangsmethode:
Bei Verwendung des grundlegenden Datenempfangs Methode: Wenn die grundlegende Datenempfangsmethode verwendet wird, wird beim Trennen des Service-Sockets eine leere Zeichenfolge empfangen. Daher kann gemäß dieser Funktion dem Programm eine Schleife hinzugefügt werden, um den Empfang von Daten fortzusetzen, bis das Daten sendende Ende die Socket-Verbindung schließt. Anwendbare Szenarien: Die Verbindung zwischen dem Client und dem Server ist eine kurze -Verbindung (dh die Verbindung wird nach einer Socket-Kommunikation geschlossen). Der Code lautet wie folgt:
import socket,struct,sys,time Port=22220 #assume a socket disconnect (data returned is empty string) means all data was #done being sent. def recv_basic(the_socket): total_data=[] while True: data = the_socket.recv(20480) if not data: break total_data.append(data) return ''.join(total_data)
2. Schwanzidentifikationsmethode
Erhalten Sie die vollständigen Daten, indem Sie im empfangenen Protokoll nach der Schwanzidentifikationszeichenfolge suchen Datendatennachricht. Anwendbares Szenario: Die empfangenen Protokolldaten enthalten relevante Tail-Identifikatoren. Der Code lautet wie folgt:
End='something useable as an end marker' def recv_end(the_socket): total_data=[];data='' while True: data=the_socket.recv(8192) if End in data: total_data.append(data[:data.find(End)]) break total_data.append(data) if len(total_data)>1: #check if end_of_data was split last_pair=total_data[-2]+total_data[-1] if End in last_pair: total_data[-2]=last_pair[:last_pair.find(End)] total_data.pop() break return ''.join(total_data)
3. Nutzlastlängenmethode
Das heißt, die Länge der effektiven Nachricht wird anhand des Nutzlastlängenwerts im Protokoll bestimmt Daten. Anwendbare Szenarien: Protokoll Die Daten enthalten ein Nutzlastprotokollfeld. Diese Methode ist ebenfalls eine relativ häufige und universelle Methode, erfordert jedoch den Empfang von Daten und das gleichzeitige Parsen der Daten. Der Code lautet wie folgt:
def recv_size(the_socket): #data length is packed into 4 bytes total_len=0;total_data=[];size=sys.maxint size_data=sock_data='';recv_size=8192 while total_len<size: sock_data=the_socket.recv(recv_size) if not total_data: if len(sock_data)>4: size_data+=sock_data size=struct.unpack('>i', size_data[:4])[0] recv_size=size if recv_size>524288:recv_size=524288 total_data.append(size_data[4:]) else: size_data+=sock_data else: total_data.append(sock_data) total_len=sum([len(i) for i in total_data ]) return ''.join(total_data)
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der drei Methoden zum Aufrufen der Recv-Funktion zum vollständigen Empfangen von Daten in der Python-Netzwerkprogrammierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!