최근 저는 네트워크 프로그래밍에 파이썬을 사용하여 범용 tcpclient 테스트 가젯을 개발하고 있습니다. 소켓을 이용한 네트워크 프로그래밍에서 상대방이 보낸 메시지의 수신 여부를 어떻게 판단하는지는 소켓 네트워크를 개발할 때 반드시 고려해야 할 문제이다. 데이터 수신 완료 여부를 판단하기 위해 일반적으로 사용되는 세 가지 방법을 간략하게 소개합니다.
1. 기본 데이터 수신 방법:
기본 데이터 수신을 사용할 경우 방식은 기본 데이터 수신 방식을 사용할 경우, 서비스 소켓이 끊어지면 빈 문자열 을 수신하게 됩니다. 따라서 이 기능에 따르면 데이터 송신 측이 소켓 연결을 닫을 때까지 데이터를 계속 수신하도록 프로그램에 루프를 추가할 수 있습니다. 적용 가능한 시나리오: 클라이언트와 서버 간의 링크는 짧은 링크입니다(즉, 한 소켓 통신 후에 연결이 닫힙니다). 코드는 다음과 같습니다.
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. 꼬리 식별 방법
수신된 프로토콜 데이터에서 꼬리 식별 문자열을 찾아 완전한 데이터를 얻습니다. 데이터그램 예술. 적용 가능한 시나리오: 수신된 프로토콜 데이터에는 관련 꼬리 식별자가 포함되어 있습니다. 코드는 다음과 같습니다.
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. 페이로드 길이 방법
프로토콜 데이터의 페이로드 길이 값을 통해 유효한 메시지의 길이를 결정하는 것입니다. 적용 가능한 시나리오: 프로토콜 데이터에 페이로드 프로토콜 필드가 포함되어 있습니다. 이 방법 역시 비교적 흔하고 보편적인 방법이지만, 데이터를 수신하는 동시에 데이터를 파싱해야 한다. 코드는 다음과 같습니다:
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)
위 내용은 Python 네트워크 프로그래밍에서 데이터를 완전히 수신하기 위해 recv 함수를 호출하는 세 가지 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!