python 네트워크 프로 그래 밍 호출 recv 함수 전체 수신 데이터 의 세 가지 방법

최근 python 을 사용 하여 네트워크 프로 그래 밍 을 진행 하여 일반적인 tcpclient 테스트 도 구 를 개발 하고 있 습 니 다.socket 을 사용 하여 네트워크 프로 그래 밍 을 진행 할 때,엔 드 에 메 시 지 를 보 내 는 것 이 완료 되 었 는 지 여 부 를 어떻게 판단 하 는 지 는 socket 네트워크 개발 을 진행 할 때 반드시 고려 해 야 할 문제 입 니 다.여기 서 판별 데이터 수신 완료 에 자주 사용 되 는 세 가지 방법 을 간략하게 소개 합 니 다.
1.기초 데이터 수신 법:
기본 데이터 수신 법 을 사용 할 때 서비스 socket 과 연결 을 끊 으 면 빈 문자열 을 받 습 니 다.따라서 이 특징 에 따라 프로그램 에 순환 을 넣 고 데이터 송신 단 이 socket 연결 을 닫 을 때 까지 데 이 터 를 계속 받 을 수 있 습 니 다.적용 장면:클 라 이언 트 와 서버 의 링크 는 짧 은 링크(즉,socket 통신 후 연결 이 닫 힙 니 다).코드 는 다음 과 같 습 니 다:

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)
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기