2017-07-26 2 views
0

C'est le code que j'utilise actuellement. Mais je voudrais qu'il soit capable d'envoyer des données sérialisées en utilisant pickle. Je bricole avec ça depuis quelques heures maintenant sans aucune chance. Peut-être que si quelqu'un ici a une meilleure expérience de réseautage, un aperçu rapide serait apprécié pour que je n'aie pas à tout réécrire, je pense que c'est déjà confus.Transmission de données sur des sockets à l'aide de cornichons et de longueur variable

import select 

def send(sdef, data, slen): 
    sdef.setblocking(0) 

    sdef.sendall(str(len(str(data))).encode("utf-8").zfill(slen)) 
    sdef.sendall(str(data).encode("utf-8")) 


def receive(sdef, slen): 
    sdef.setblocking(0) 
    ready = select.select([sdef], [], [], 60) 
    if ready[0]: 
     data = int(sdef.recv(slen)) # receive length 
     # print "To receive: "+str(data) 
    else: 
     raise RuntimeError("Socket timeout") 

    chunks = [] 
    bytes_recd = 0 
    while bytes_recd < data: 
     ready = select.select([sdef], [], [], 60) 
     if ready[0]: 
      chunk = sdef.recv(min(data - bytes_recd, 2048)) 
      if chunk == b'': 
       raise RuntimeError("Socket connection broken") 
      chunks.append(chunk) 
      bytes_recd = bytes_recd + len(chunk) 
     else: 
      raise RuntimeError("Socket timeout") 

    segments = b''.join(chunks).decode("utf-8") 
    # print "Received segments: "+str(segments) 

    return segments 

Simplest mise en œuvre:

import select, pickle 

def send(sdef, data, slen): 
    sdef.setblocking(0) 

    sdef.sendall(str(len(str(pickle.dumps(data)))).encode("utf-8").zfill(slen)) 
    sdef.sendall(str(pickle.dumps(data)).encode("utf-8")) 


def receive(sdef, slen): 
    sdef.setblocking(0) 
    ready = select.select([sdef], [], [], 60) 
    if ready[0]: 
     data = int(sdef.recv(slen)) # receive length 
     # print "To receive: "+str(data) 
    else: 
     raise RuntimeError("Socket timeout") 

    chunks = [] 
    bytes_recd = 0 
    while bytes_recd < data: 
     ready = select.select([sdef], [], [], 60) 
     if ready[0]: 
      chunk = sdef.recv(min(data - bytes_recd, 2048)) 
      if chunk == b'': 
       raise RuntimeError("Socket connection broken") 
      chunks.append(chunk) 
      bytes_recd = bytes_recd + len(chunk) 
     else: 
      raise RuntimeError("Socket timeout") 

    segments = b''.join(chunks).decode("utf-8") 
    # print "Received segments: "+str(segments) 

    return segments 

et je ne peux pas deserialize "segments" plus, car il est une chaîne

Répondre

0

Ceci est la façon de l'obtenir, literaleval devrait fonctionner en toutes circonstances sur données sérialisées

pickle.loads(ast.literal_eval(segments))