Recently I am using python for network programming to develop a general tcpclient test gadget. In network programming using sockets, how to determine whether a message sent by the peer has been received is an issue that must be considered when developing socket networks. Here, a brief introduction to the three commonly used methods to determine the completion of data reception:
1. Basic data reception method:
When using the basic data reception method, when using the basic data reception method, When the service socket is disconnected, an empty string will be received. Therefore, according to this feature, a loop can be added to the program to continue receiving data until the data sending end closes the socket connection. Applicable scenarios: The link between the client and the server is a short link (that is, the connection will be closed after one socket communication). The code is as follows:
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. Tail identification method
By looking for the tail identification string in the received protocol data, obtain the complete data datagram arts. Applicable scenario: The received protocol data contains relevant tail identifiers. The code is as follows:
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. Payload length method
That is to determine the length of the effective message through the payload length value in the protocol data. Applicable scenario: in the protocol data Contains the payload protocol field. This method is also a relatively common and universal method, but it requires receiving data and parsing the data at the same time. The code is as follows:
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)
The above is the detailed content of Detailed explanation of three methods of calling the recv function to completely receive data in Python network programming. For more information, please follow other related articles on the PHP Chinese website!