You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rich进度条在Socket文件共享中显示异常:进度瞬间完成100%

Socket文件共享中Rich进度条瞬间完成100%的问题排查与修复

核心问题原因

Rich进度条的progress.update方法中,advance参数的作用是单次进度推进的增量字节数,而非累计的总传输量。你的代码里每次把累计的data_sent/data_recieved传给advance,导致进度条被一次性拉到甚至超过总目标值,看起来瞬间完成100%。

具体错误点与修复方案

1. 发送端(sender.py)错误

原代码用累计发送量更新进度:

progress.update(send_task, advance=data_sent)

需改为使用本次实际发送的字节数(即sock.send(data)的返回值):

sent_bytes = sock.send(data)
data_sent += sent_bytes
progress.update(send_task, advance=sent_bytes)

2. 接收端(reciever.py)错误

原代码用累计接收量更新进度:

progress.update(recv_task, advance=data_recieved)

需改为使用本次实际写入的字节数(即f.write(data)的返回值):

written_bytes = f.write(data)
data_recieved += written_bytes
progress.update(recv_task, advance=written_bytes)

额外优化点

  • Windows路径转义:文件名用原始字符串避免转义问题,比如r"C:\Users\usename\Downloads\ubuntu-23.04-desktop-amd64.iso"
  • 拼写修正:接收端任务描述Recieving改为正确的Receiving
  • 动态获取文件大小:用os.path.getsize(filename)代替硬编码,避免手动输入错误

修正后的完整代码

sender.py

import socket
import os
from pip._vendor.rich.progress import (Progress, TextColumn, BarColumn, TransferSpeedColumn, DownloadColumn, TaskProgressColumn)

sock = socket.socket()
sock.connect(('127.0.0.1', 9999))
filename = r"C:\Users\usename\Downloads\ubuntu-23.04-desktop-amd64.iso"
filesize = os.path.getsize(filename)  # 动态获取文件大小

with Progress(
    TextColumn("[progress.description]{task.description}"),
    BarColumn(),
    TaskProgressColumn(),
    DownloadColumn(binary_units=True),
    TextColumn('at'),
    TransferSpeedColumn()
) as progress:
    send_task = progress.add_task("Sending...", total=filesize)
    with open(filename, 'rb') as f:
        data_sent = 0
        while True:
            data = f.read(102400)
            if not data:
                break
            sent_bytes = sock.send(data)
            data_sent += sent_bytes
            progress.update(send_task, advance=sent_bytes)
sock.close()

reciever.py

import socket
from pip._vendor.rich.progress import (Progress, TextColumn, BarColumn, TransferSpeedColumn, DownloadColumn, TaskProgressColumn)

sock = socket.socket()
sock.bind(("127.0.0.1", 9999))
sock.listen(10)
conn, address = sock.accept()
filename = 'ubuntu-23.04-desktop-amd64.iso'
filesize = 4932407296  # 可优化为从发送端先接收文件大小,此处保留原硬编码

print(address)
with Progress(
    TextColumn("[progress.description]{task.description}"),
    BarColumn(),
    TaskProgressColumn(),
    DownloadColumn(binary_units=True),
    TextColumn('at'),
    TransferSpeedColumn()
) as progress:
    recv_task = progress.add_task("Receiving...", total=filesize)
    with open(filename,'wb') as f:
        data_recieved = 0
        while data_recieved < filesize:
            data = conn.recv(102400)
            written_bytes = f.write(data)
            data_recieved += written_bytes
            progress.update(recv_task, advance=written_bytes)
conn.close()
sock.close()

内容的提问来源于stack exchange,提问作者Sajjad Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:44:58