Python 네트워크 프로그래밍에서 데이터를 완전히 수신하기 위해 recv 함수를 호출하는 세 가지 방법에 대한 자세한 설명

高洛峰
풀어 주다: 2017-03-27 15:07:24
원래의
2846명이 탐색했습니다.

최근 저는 네트워크 프로그래밍파이썬을 사용하여 범용 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(&#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)
로그인 후 복사

위 내용은 Python 네트워크 프로그래밍에서 데이터를 완전히 수신하기 위해 recv 함수를 호출하는 세 가지 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿