python文件传输 带进度条

python 复制代码
# -*- coding: utf-8 -*-
"""
文件传输程序(带进度条版本)

功能说明:
服务端:接收文件
客户端:发送文件

使用方法:
1. 启动服务端(接收文件):
   python file_transfer.py server [监听IP] [监听端口]

2. 发送文件到指定地址:
   python file_transfer.py 文件路径 [服务器IP] [服务器端口]

示例:
   # 监听所有接口的8888端口
   python file_transfer.py server 0.0.0.0 8888
   
   # 发送文件到指定服务器的8888端口
   python file_transfer.py data.txt 192.168.1.100 8888
"""
import socket
import os
from tqdm import tqdm
import threading
import time
def run_server(host='127.0.0.1', port=12345):
    """
    文件接收服务端
    :param host: 监听地址
    :param port: 监听端口
    """
    # 创建TCP socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host, port))
    server_socket.listen(10)
    
    print(f"[*] 监听 {host}:{port}")
    
    try:
        while True:
            client_socket, addr = server_socket.accept()
            print(f"[+] 连接来自 {addr}")
            # 为每个客户端创建新线程
            client_thread = threading.Thread(
                target=handle_client,
                args=(client_socket, addr)
            )
            client_thread.start()

    except KeyboardInterrupt:
        print("\n[!] 服务端关闭")
    finally:
        server_socket.close()

# 新增客户端处理函数
def handle_client(client_socket, addr):
    """处理单个客户端连接"""
    try:
        # 接收文件名
        file_name = client_socket.recv(1024).decode('utf-8')
        print(f"[*] 接收文件: {file_name}")
        # 新增文件存在检查
        if os.path.exists(file_name):
            client_socket.sendall(b'FileExists')
            time.sleep(0.1)  # 新增短暂延迟
            print(f"[!] 文件 {file_name} 已存在,拒绝接收")
            return
            
        client_socket.send(b'FilenameReceived')
        
        # 接收文件大小
        file_size = int(client_socket.recv(1024).decode('utf-8'))
        client_socket.send(b'Filesize received')
        
        # 接收文件内容(保持原有逻辑)
        progress = tqdm(total=file_size, unit='B', unit_scale=True, desc=f"接收 {file_name}")
        with open(file_name, 'wb') as file:
            received_size = 0
            while received_size < file_size:
                data = client_socket.recv(1024)
                file.write(data)
                received_size += len(data)
                progress.update(len(data))
        
        progress.close()
        print(f"[√] 文件 {file_name} 接收完成")

    except Exception as e:
        print(f"[!] 客户端 {addr} 处理异常: {str(e)}")
    finally:
        client_socket.close()

def send_file(file_path, host='127.0.0.1', port=12345):
    """
    发送文件到服务端
    :param file_path: 要发送的文件路径
    :param host: 服务端地址
    :param port: 服务端端口
    """
    if not os.path.exists(file_path):
        print(f"[!] 文件 {file_path} 不存在")
        return
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    try:
        client_socket.connect((host, port))
        print(f"[*] 已连接到 {host}:{port}")
        
        # 发送文件名
        file_name = os.path.basename(file_path)
        print(f"[*] 准备发送文件: {file_name}")
        client_socket.send(file_name.encode('utf-8'))
        data = client_socket.recv(1024)  # 等待确认
        print(data)
        # 发送文件大小
        file_size = os.path.getsize(file_path)
        client_socket.send(str(file_size).encode('utf-8'))
        client_socket.recv(1024)  # 等待确认
        
        # 发送文件内容
        progress = tqdm(total=file_size, unit='B', unit_scale=True, desc=f"发送 {file_name}")
        with open(file_path, 'rb') as file:
            while True:
                data = file.read(1024)
                if not data:
                    break
                client_socket.send(data)
                progress.update(len(data))
        
        progress.close()
        print(f"[√] 文件 {file_name} 发送完成")  # 修复:移动到try块内部
    
    except Exception as e:
        print(f"[!] 错误发生: {str(e)}")
    finally:
        client_socket.close()

if __name__ == "__main__":
    # 使用示例
    import sys
    if len(sys.argv) > 1 and sys.argv[1] == 'server':
        # 解析服务端参数:python file_transfer.py server [IP] [PORT]
        server_host = sys.argv[2] if len(sys.argv) > 2 else '127.0.0.1'
        server_port = int(sys.argv[3]) if len(sys.argv) > 3 else 12345
        run_server(server_host, server_port)
    else:
        # 解析客户端参数:python file_transfer.py 文件路径 [IP] [PORT]
        if len(sys.argv) < 2:
            print("使用方法:")
            print("  接收文件: python file_transfer.py server [IP] [端口]")
            print("  发送文件: python file_transfer.py 文件路径 [IP] [端口]")
            sys.exit()
            
        file_path = sys.argv[1]
        send_host = sys.argv[2] if len(sys.argv) > 2 else '127.0.0.1'
        send_port = int(sys.argv[3]) if len(sys.argv) > 3 else 12345
        send_file(file_path, send_host, send_port)
相关推荐
念念01079 分钟前
数学建模竞赛中评价类相关模型
python·数学建模·因子分析·topsis
云天徽上41 分钟前
【数据可视化-94】2025 亚洲杯总决赛数据可视化分析:澳大利亚队 vs 中国队
python·信息可视化·数据挖掘·数据分析·数据可视化·pyecharts
☺����1 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码2
开发语言·人工智能·python·音视频
王者鳜錸1 小时前
PYTHON让繁琐的工作自动化-函数
开发语言·python·自动化
xiao助阵2 小时前
python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
开发语言·python
xixingzhe22 小时前
多人同时导出 Excel 导致内存溢出
服务器·设计
吱吱企业安全通讯软件2 小时前
吱吱企业通讯软件保证内部通讯安全,搭建数字安全体系
大数据·网络·人工智能·安全·信息与通信·吱吱办公通讯
云手机掌柜3 小时前
Tumblr长文运营:亚矩阵云手机助力多账号轮询与关键词布局系统
大数据·服务器·tcp/ip·矩阵·流量运营·虚幻·云手机
麻辣清汤4 小时前
结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))
数据库·python·sql·finebi
云边云科技4 小时前
零售行业新店网络零接触部署场景下,如何选择SDWAN
运维·服务器·网络·人工智能·安全·边缘计算·零售