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

How to send a pickled object across a server with encoding? Python 3

我想将对象 Account 的 pickled 编码版本发送到我的服务器,然后在服务器端对其进行解码并将其恢复为具有相应数据的对象,但我不确定如何将其转换回来从字符串到字节(?)数据类型作为对象。

在客户端,基本上是这样的:

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

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

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

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

基本上,我只需要知道是否可以对腌制的帐户对象进行编码以发送它,或者这样做是否永远行不通并且这样做很愚蠢。

格式行的问题是您插入了 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 作为字节数组发送

希望有所帮助

客户端:

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)