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
,我不能反序列化“细分”了,因为它是一个字符串