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
相关产品推荐
相关产品推荐

