Sockets 使用pickle和可变长度通过套接字传递数据

Sockets 使用pickle和可变长度通过套接字传递数据,sockets,serialization,deserialization,python-3.5,pickle,Sockets,Serialization,Deserialization,Python 3.5,Pickle,这是我目前正在使用的代码。但我希望它能够使用pickle发送序列化数据。我已经修补了好几个小时了,运气不好。也许如果这里有人有更好的网络经验,quick insight将不胜感激,这样我就不必重写所有内容,我认为它已经让人困惑了 import select def send(sdef, data, slen): sdef.setblocking(0) sdef.sendall(str(len(str(data))).encode("utf-8").zfill(slen))

这是我目前正在使用的代码。但我希望它能够使用pickle发送序列化数据。我已经修补了好几个小时了,运气不好。也许如果这里有人有更好的网络经验,quick insight将不胜感激,这样我就不必重写所有内容,我认为它已经让人困惑了

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
导入选择
def发送(sdef、数据、slen):
sdef.0(0)
sdef.sendall(str(len(str(data))).encode(“utf-8”).zfill(slen))
sdef.sendall(str(data).encode(“utf-8”))
def接收(sdef、slen):
sdef.0(0)
就绪=选择。选择([sdef],[],60)
如果准备就绪[0]:
数据=int(sdef.recv(slen))#接收长度
#打印“接收:”+str(数据)
其他:
引发运行时错误(“套接字超时”)
块=[]
字节记录=0
当字节记录<数据时:
就绪=选择。选择([sdef],[],60)
如果准备就绪[0]:
chunk=sdef.recv(最小值(数据-字节记录,2048))
如果chunk==b“”:
引发运行时错误(“套接字连接断开”)
chunk.append(chunk)
字节记录=字节记录+长度(块)
其他:
引发运行时错误(“套接字超时”)
段=b“”。连接(块)。解码(“utf-8”)
#打印“接收段:”+str(段)
返回段
最简单的实现:

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
导入选择,pickle
def发送(sdef、数据、slen):
sdef.0(0)
sdef.sendall(str(len(str(pickle.dumps(data)))).encode(“utf-8”).zfill(slen))
sdef.sendall(str(pickle.dumps(data)).encode(“utf-8”))
def接收(sdef、slen):
sdef.0(0)
就绪=选择。选择([sdef],[],60)
如果准备就绪[0]:
数据=int(sdef.recv(slen))#接收长度
#打印“接收:”+str(数据)
其他:
引发运行时错误(“套接字超时”)
块=[]
字节记录=0
当字节记录<数据时:
就绪=选择。选择([sdef],[],60)
如果准备就绪[0]:
chunk=sdef.recv(最小值(数据-字节记录,2048))
如果chunk==b“”:
引发运行时错误(“套接字连接断开”)
chunk.append(chunk)
字节记录=字节记录+长度(块)
其他:
引发运行时错误(“套接字超时”)
段=b“”。连接(块)。解码(“utf-8”)
#打印“接收段:”+str(段)
返回段

我不能再反序列化“段”,因为它是一个字符串

这是获取它的方法,literaleval应该在任何情况下都能在序列化数据上工作

pickle.loads(ast.literal_eval(segments))