我想把一个经过腌制、编码的对象账号发送到我的服务器上,然后在服务器端对其进行解码,并将其恢复为具有相应数据的对象,然而我不确定如何将其从字符串转换回字节(?)数据类型作为一个对象。
在客户端,基本上是这样的情况。
command = 'insert account'
tempAccount = Account('Isabel', 'password')
pickledAcc = pickle.dumps(tempAccount)
clientCommand = f"{command},{pickledAcc}".encode('utf-8')
client.send(clientCommand)
然而在服务器端,它收到的是一个空字符串作为pickledAcc部分。
我已经简化了我的代码,但我认为基本要素都在那里,但如果你需要更多,我可以给它lol。还应该提到的是,我已经使用了适当的长度礼仪,即在这之前发送一个消息来通知服务器这个消息会有多长。而且我所有的服务器基础设施都能正常工作:)
基本上,我只需要知道是否可以对腌制的账户对象进行编码来发送,或者这样做是否永远不会工作,而且这样做很愚蠢。
格式行的问题在于你插入了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)