如何用编码在服务器上发送一个腌制的对象?Python 3

问题描述 投票:0回答:1

我想把一个经过腌制、编码的对象账号发送到我的服务器上,然后在服务器端对其进行解码,并将其恢复为具有相应数据的对象,然而我不确定如何将其从字符串转换回字节(?)数据类型作为一个对象。

在客户端,基本上是这样的情况。

command = 'insert account'
tempAccount = Account('Isabel', 'password')
pickledAcc = pickle.dumps(tempAccount)

clientCommand = f"{command},{pickledAcc}".encode('utf-8')
client.send(clientCommand)

然而在服务器端,它收到的是一个空字符串作为pickledAcc部分。

我已经简化了我的代码,但我认为基本要素都在那里,但如果你需要更多,我可以给它lol。还应该提到的是,我已经使用了适当的长度礼仪,即在这之前发送一个消息来通知服务器这个消息会有多长。而且我所有的服务器基础设施都能正常工作:)

基本上,我只需要知道是否可以对腌制的账户对象进行编码来发送,或者这样做是否永远不会工作,而且这样做很愚蠢。

python-3.x sockets object pickle
1个回答
1
投票

格式行的问题在于你插入了pickledAcc的__repr__而不是真正的字节。这将不会得到你想要的结果。

例如:

command = "test"
pickledAcc = pickle.dumps("test_data")
clientCommand  = f"{command},{pickledAcc}".encode('utf-8')

现在客户端命令将输出:

b"test,b'\\x80\\x03X\\t\\x00\\x00\\x00test_dataq\\x00.'"

如你所见,字节数组的表示方式被编码为utf-8 ("b/\...")

为了解决这个问题,我建议你将命令转换为字节数组,然后以字节数组的形式发送clientCommand。

希望能帮到你


1
投票

客户端。

import base64

##--snip--##

pickledAcc = base64.b64encode(pickledAcc).decode()

clientCommand = f"{command},{pickledAcc}".encode('utf-8')
client.send(clientCommand)

服务器端:

import base64

##--snip--##

pickledAcc = base64.b64decode(pickledAcc)
pickledAcc = pickle.loads(pickledAcc)
© www.soinside.com 2019 - 2024. All rights reserved.