【项目实训】关于使用python的socket进行数据传输时缺失数据的解决方法

在后端与聚合端的交互中存在这样一个操作,就是后端需要把torch包之下通过将模型load_state_dict提取到的模型参数通过网络送到聚合端进行聚合,而聚合端在进行聚合操作后也需要将网络参数字典返还到后端。

我们的项目采用了python标准库中的socket以及pickle来进行这样的操作,其好处是两边只要使用相同的class对象即可进行对象的传输。

而目前我们遇到的问题在于传输较大的字节流时,猜测是由于传输与接收速度不匹配的缘故,会出现一个提示socket pickle data was truncated的错误,意味数据被截断。起初我们为了能够一次性接收所有数据,就将缓冲区设置得很大。(如下图代码)

Socket.recv(999999)

结果是有些时候可以完全接收,有些则会报socket pickle data was truncated,这意味在这样的设计下这样的错误的出现是随机的,于是后面我们重新设计了一个机制,不仅可以针对不同大小的字节流,也能保证出现数据截断问题时可以重传。(其实类似tcp的思想)

代码如下:

# 参数为socket以及要发送的数据对象
def muteki_send(clientSocket, message):
    temp_pickle = pickle.dumps(message)
    # 先发送大小信息
    size = sys.getsizeof(temp_pickle)
    size = pickle.dumps(size)
    clientSocket.sendall(size)
    # 接收确认信息
    ack = clientSocket.recv(1024)

    # 当ack为true,循环发送数据直到ack改为false
    while True:
        # 数据发送
        clientSocket.sendall(temp_pickle)
        # 大小比对信息接收
        # 接收大小确认信息,若为true break,若为false重发
        sizeACK = clientSocket.recv(1024)
        sizeACK = pickle.loads(sizeACK)
        if sizeACK:
            break
def muteki_recv(clientSocket):
    # 接收大小信息
    size = clientSocket.recv(1024)
    size = pickle.loads(size)
    # send确认信息
    ack = pickle.dumps(True)
    clientSocket.sendall(ack)

    # 开始循环接收数据,直到数据大小一致
    # try:
    sizeJudge = True
    finalData = ''
    while sizeJudge:
        data = clientSocket.recv(1024)
        time.sleep(0.1)
        temp = sys.getsizeof(data)
        judge = (sys.getsizeof(data) == 1057)
        if judge:
            while True:
                packet = clientSocket.recv(2048)
                time.sleep(0.0005)
                data += packet
                if sys.getsizeof(packet) < (2048 + 33):
                    break
        # 比对大小信息,若一致则发送true break,不一致返回false重新接收
        if sys.getsizeof(data) == size:
            sizeACK = pickle.dumps(True)
            clientSocket.sendall(sizeACK)
            finalData = data
            break
        else:
            sizeACK = pickle.dumps(False)
            clientSocket.sendall(sizeACK)
            continue
    return finalData

这样双方就能以大小为依据确认是否出现丢包,从而在出现错误时进行重传。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芜湖大司码丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值