leonheart 发表于 2018-8-4 06:41:46

python socket recv方法

Port=2222  #assume a socket disconnect (data returned is empty string) meansall data was #done being sent.
  def recv_basic(the_socket):
  total_data=[]
  while True:
  data = the_socket.recv(8192)
  if not data: break
  total_data.append(data)
  return ''.join(total_data)
  def recv_timeout(the_socket,timeout=2):
  the_socket.setblocking(0)
  total_data=[];data='';begin=time.time()
  while 1:
  #if you got some data, then break after wait sec
  if total_data and time.time()-begin>timeout:
  break
  #if you got no data at all, wait a little longer
  elif time.time()-begin>timeout*2:
  break
  try:
  data=the_socket.recv(8192)
  if data:
  total_data.append(data)
  begin=time.time()
  else:
  time.sleep(0.1)
  except:
  pass
  return ''.join(total_data)
  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)
  def recv_size(the_socket):
  #data length is packed into 4 bytes
  total_len=0;total_data=[];size=sys.maxint

  >  while total_len<size:
  sock_data=the_socket.recv(recv_size)
  if not total_data:
  if len(sock_data)>4:

  >
  >  recv_size=size
  if recv_size>524288:recv_size=524288
  total_data.append(size_data)
  else:

  >  else:
  total_data.append(sock_data)
  total_len=sum()
  return ''.join(total_data)
  ##############
  def start_server(recv_type=''):
  sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  sock.bind(('',Port))
  sock.listen(5)
  print 'started on',Port
  while True:
  newsock,address=sock.accept()
  print 'connected'
  if recv_type=='size': result=recv_size(newsock)
  elif recv_type=='end': result=recv_end(newsock)
  elif recv_type=='timeout': result=recv_timeout(newsock)
  else: result=newsock.recv(8192)
  print 'got',result
  if __name__=='__main__':
  #start_server()
  #start_server(recv_type='size')
  #start_server(recv_type='timeout')
  start_server(recv_type='end')
  def send_size(data):
  sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  sock.connect(('localhost',Port))
  sock.sendall(struct.pack('>i', len(data))+data)
  sock.close()
  def send_end(data):
  sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  sock.connect(('localhost',Port))
  sock.sendall(data+End)
  sock.close()
页: [1]
查看完整版本: python socket recv方法