python在使用pickle反序列化时报错:_pickle.UnpicklingError: pickle data was truncated

问题描述:

使用pickle序列化和反序列化进行socket传输时,发送方可以正常执行,接收方报错:_pickle.UnpicklingError: pickle data was truncated

参考:https://blog.csdn.net/qq_42816922/article/details/110678845

通信双方代码:
@发送方
	connection, address = sock.accept()
	message = connection.recv(1024).decode()
    if message == 'helper':
        Helper_pickle = pickle.dumps(Helper)
        helper = Helper_pickle
        connection.sendall(helper)
        connection.close()
@接收方
	sock = socket.socket()
    sock.connect((HOST, PORT)) 
    message = 'helper'
    sock.sendall(message.encode())
    data = sock.recv(1024)
    Helper = pickle.loads(data)

执行结果报错:_pickle.UnpicklingError: pickle data was truncated

原因分析

根据报错提示:数据被截断,反序列化出现错误。
实际上socket.recv的缓冲区是有限的,就算设置4096*4096也会导致长数据的截断。
接收方并没有接收到完整的数据,导致在进行反序列化时,pickle无法正确进行反序列化,进而出错。

解决方案

@接收方
	sock = socket.socket()
    sock.connect((HOST, PORT)) 
    message = 'helper'
    sock.sendall(message.encode())
	data = b""
     	while True:
            packet = client.recv(4096)
            # print("1")
            if packet is not None:
                data += packet
            if packet is None or len(packet) < 4096:
                break
        print("Download weights finished", len(data))
        Helper = pickle.loads(data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值