Detaillierte Erläuterung der drei Methoden zum Aufrufen der Recv-Funktion zum vollständigen Empfangen von Daten in der Python-Netzwerkprogrammierung

高洛峰
Freigeben: 2017-03-27 15:07:24
Original
2831 Leute haben es durchsucht

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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(&#39;>i&#39;, 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 &#39;&#39;.join(total_data)
Nach dem Login kopieren

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!

Verwandte Etiketten:
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage