2017-07-26 30 views
0

这是我目前使用的代码。但我希望它能够使用pickle发送序列化的数据。我一直在修补它几个小时,但没有运气。也许如果某人在这里有更好的网络体验,快速的洞察力将不胜感激,所以我不需要重写所有的东西,我认为它已经很混乱了。使用pickle和可变长度在套接字上传递数据

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 

简单的实现:

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 

,我不能反序列化“细分”了,因为它是一个字符串

回答

0

这是得到它的方式,literaleval应该在任何情况下工作的序列化数据

pickle.loads(ast.literal_eval(segments)) 
相关问题