Sockets 使用pickle和可变长度通过套接字传递数据
这是我目前正在使用的代码。但我希望它能够使用pickle发送序列化数据。我已经修补了好几个小时了,运气不好。也许如果这里有人有更好的网络经验,quick insight将不胜感激,这样我就不必重写所有内容,我认为它已经让人困惑了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))
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))