如何使用编码在服务器上发送腌制对象? 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)
我想将对象 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)