局域网传输文件是最最常用的功能,我参考https://www.jb51.net/python/345837qrz.htm这篇文章,复制粘贴,开发了一个。但发现进度条没有用,也没有显示传输用时和传输速度的功能,于是我改写了代码,使它实现这个功能。

import socket
import osdef start_server(host='192.168.1.145', port=8888):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen(1)print(f"服务器启动,监听 {host}:{port}")while True:client_socket, addr = server_socket.accept()print(f"连接来自 {addr}")# 接收文件名和大小file_info = client_socket.recv(1024).decode()file_name, file_size = file_info.split('|')file_size = int(file_size)# 创建文件并写入数据with open('d:/socketfile/'+file_name, 'wb') as file:received = 0while received < file_size:data = client_socket.recv(4096)file.write(data)received += len(data)print(f"接收进度: {received}/{file_size} 字节")client_socket.close()print(f"文件 {file_name} 接收完成")if __name__ == "__main__":start_server()

上面是服务器端,没有怎么改,增加了'd:/socketfile/'+file_name,把文件放在我们想要放的文件夹。

# -*- coding: utf-8 -*-
"""
Created on Mon Sep  8 14:31:28 2025@author: YBK
"""import socket
import os
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext
import threading
from tkinter import ttk
import timeclass FileTransferGUI:def __init__(self, master):self.master = mastermaster.title("局域网文件传输工具")master.geometry("500x400")# 输入服务器IPtk.Label(master, text="服务器IP:").pack(pady=5)self.ip_entry = tk.Entry(master, width=30)self.ip_entry.pack(pady=5)self.ip_entry.insert(0, "192.168.1.145")  # 默认IP,根据实际修改#发生使用时间、传输速度self.usetime = 0self.sudu = 0# 文件选择按钮tk.Button(master, text="选择文件", command=self.select_file).pack(pady=10)self.file_path = ""# 发送按钮tk.Button(master, text="发送文件", command=self.start_send).pack(pady=10)# 进度显示self.progress_var = tk.DoubleVar()self.progress_bar = ttk.Progressbar(master, variable=self.progress_var, maximum=100)self.progress_bar.pack(fill=tk.X, padx=20, pady=10)# 日志区域self.log_area = scrolledtext.ScrolledText(master, height=10)self.log_area.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)self.log_area.config(state=tk.DISABLED)def send_file(self,server_ip, file_path, port=8888):        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:client_socket.connect((server_ip, port))file_name = os.path.basename(file_path)file_size = os.path.getsize(file_path)# 发送文件信息client_socket.send(f"{file_name}|{file_size}".encode())# 分块发送文件数据with open(file_path, 'rb') as file:sent = 0start = time.time()while sent < file_size:data = file.read(4096)client_socket.send(data)sent += len(data)# print(f"发送进度: {sent}/{file_size} 字节")self.progress_var.set(int(sent/file_size*100))self.usetime = time.time() - startself.sudu = file_size / 1024 / 1024 / self.usetimeprint(f"文件发送成功,耗时{self.usetime:.2f}秒,速度:{self.sudu:.2f}m/s")except Exception as e:print(f"错误: {e}")finally:client_socket.close()def select_file(self):self.file_path = filedialog.askopenfilename()if self.file_path:self.log(f"已选择文件: {self.file_path}")def start_send(self):server_ip = self.ip_entry.get()if not server_ip or not self.file_path:messagebox.showerror("错误", "请输入IP并选择文件")return# 在新线程中发送文件,避免GUI冻结threading.Thread(target=self.send_file_thread, args=(server_ip, self.file_path)).start()def send_file_thread(self, server_ip, file_path):try:self.log("开始发送文件...")self.send_file(server_ip, file_path)  # 调用步骤2的发送函数self.progress_var.set(100)self.log(f"文件发送完成!耗时{self.usetime:.4f}秒,速度:{self.sudu:.2f}m/s")except Exception as e:self.log(f"错误: {e}")def log(self, message):self.log_area.config(state=tk.NORMAL)self.log_area.insert(tk.END, message + "\n")self.log_area.config(state=tk.DISABLED)self.log_area.yview(tk.END)if __name__ == "__main__":root = tk.Tk()app = FileTransferGUI(root)root.mainloop()

以上就改动比较大,也让我慢慢熟悉面向对象编程,用self.可以为公用变量,增加时间和速度的显示,原来代码出现tk.Progressbar报错,进度条无法正常显示等问题。

速度还是可以的。

用一段时间,感觉还是不爽,要开2个程序,一个是服务器端,一个是客户端,才能在2台电脑中互传文件,为此,我把它一体化,只要用一个程序就实现了服务器端和客户端的功能,又能接受文件,又能发送文件。同时,加上我一直喜欢用的拖放功能,不能每次去选择文件传输。

# -*- coding: utf-8 -*-
"""
Created on Mon Sep  8 14:31:28 2025@author: YBK
"""import socket
import os
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext
import threading
from tkinter import ttk
import time
import windnd
from tkinter import LabelFrame
import chardetdef start_server(host='192.168.1.140', port=8888):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen(1)print(f"服务器启动,监听 {host}:{port}")while True:client_socket, addr = server_socket.accept()print(f"连接来自 {addr}")# 接收文件名和大小raw_data = client_socket.recv(1024)encoding = chardet.detect(raw_data)['encoding']file_info = raw_data.decode(encoding)file_name, file_size = file_info.split('|')file_size = int(file_size)# 创建文件并写入数据with open('e:/socketfile/'+file_name, 'wb') as file:received = 0while received < file_size:data = client_socket.recv(4096)file.write(data)received += len(data)print(f"接收进度: {received}/{file_size} 字节")client_socket.close()print(f"文件 {file_name} 接收完成")class FileTransferGUI:def __init__(self, master):self.master = mastermaster.title("局域网文件传输工具")master.geometry("500x600")# 输入服务器IPtk.Label(master, text="服务器IP:").pack(pady=5)self.ip_entry = tk.Entry(master, width=30)self.ip_entry.pack(pady=5)self.ip_entry.insert(0, "192.168.1.145")  # 默认IP,根据实际修改tk.Label(master, text="本机IP(作为服务器):").pack(pady=5)self.bip_entry = tk.Entry(master, width=30)self.bip_entry.pack(pady=5)self.bip_entry.insert(0, "192.168.1.140")  # 默认IP,根据实际修改# 启动服务器按钮self.bt_fwq = tk.Button(master, text="启动服务器", command=self.start_fwq)self.bt_fwq.pack(pady=10)#发生使用时间self.usetime = 0self.sudu = 0# 文件选择按钮tk.Button(master, text="选择文件", command=self.select_file).pack(pady=10)self.file_path = ""# 文件拖放区域self.f_frame = LabelFrame(master, text="也可以拖放文件到此", width=250)self.f_frame.pack(expand=True, padx=10)self.label1 = tk.Label(self.f_frame,wraplength=580,text="")self.label1.pack(anchor="w", pady=5)windnd.hook_dropfiles(self.f_frame, func=self.handle_file)# 发送按钮tk.Button(master, text="发送文件", command=self.start_send).pack(pady=10)# 进度显示self.progress_var = tk.DoubleVar()self.progress_bar = ttk.Progressbar(master, variable=self.progress_var, maximum=100)self.progress_bar.pack(fill=tk.X, padx=20, pady=10)# 日志区域self.log_area = scrolledtext.ScrolledText(master, height=10)self.log_area.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)self.log_area.config(state=tk.DISABLED)def start_server(self,host='192.168.1.140', port=8888):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen(1)print(f"服务器启动,监听 {host}:{port}")while True:client_socket, addr = server_socket.accept()print(f"连接来自 {addr}")# 接收文件名和大小raw_data = client_socket.recv(1024)encoding = chardet.detect(raw_data)['encoding']file_info = raw_data.decode(encoding)file_name, file_size = file_info.split('|')file_size = int(file_size)# 创建文件并写入数据with open('e:/socketfile/'+file_name, 'wb') as file:received = 0while received < file_size:data = client_socket.recv(4096)file.write(data)received += len(data)print(f"接收进度: {received}/{file_size} 字节")client_socket.close()print(f"文件 {file_name} 接收完成")self.log(f"文件 {file_name} 接收完成")def handle_file(self,files):if len(files) > 0:path = files[0].decode('gbk').replace('\\', '/')self.file_path = pathif self.file_path:self.log(f"已选择文件: {self.file_path}")def start_fwq(self):fwq_ip = self.bip_entry.get()if not fwq_ip:messagebox.showerror("错误", "请输入IP并选择文件")return# print(fwq_ip)# 在新线程中发送文件,避免GUI冻结threading.Thread(target=self.start_server, args=(fwq_ip, 8888)).start()self.bt_fwq.config(state="disabled", bg="lightgray")def send_file(self,server_ip, file_path, port=8888):        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:client_socket.connect((server_ip, port))file_name = os.path.basename(file_path)file_size = os.path.getsize(file_path)# 发送文件信息client_socket.send(f"{file_name}|{file_size}".encode())# 分块发送文件数据with open(file_path, 'rb') as file:sent = 0start = time.time()while sent < file_size:data = file.read(4096)client_socket.send(data)sent += len(data)# print(f"发送进度: {sent}/{file_size} 字节")self.progress_var.set(int(sent/file_size*100))self.usetime = time.time() - startself.sudu = file_size / 1024 / 1024 / self.usetimeprint(f"文件发送成功,耗时{self.usetime:.2f}秒,速度:{self.sudu:.2f}m/s")except Exception as e:print(f"错误: {e}")finally:client_socket.close()def select_file(self):self.file_path = filedialog.askopenfilename()if self.file_path:self.log(f"已选择文件: {self.file_path}")def start_send(self):server_ip = self.ip_entry.get()if not server_ip or not self.file_path:messagebox.showerror("错误", "请输入IP并选择文件")return# 在新线程中发送文件,避免GUI冻结threading.Thread(target=self.send_file_thread, args=(server_ip, self.file_path)).start()def send_file_thread(self, server_ip, file_path):try:self.log("开始发送文件...")self.send_file(server_ip, file_path)  # 调用步骤2的发送函数self.progress_var.set(100)self.log(f"文件发送完成!耗时{self.usetime:.4f}秒,速度:{self.sudu:.2f}m/s")except Exception as e:self.log(f"错误: {e}")def log(self, message):self.log_area.config(state=tk.NORMAL)self.log_area.insert(tk.END, message + "\n")self.log_area.config(state=tk.DISABLED)self.log_area.yview(tk.END)if __name__ == "__main__":root = tk.Tk()app = FileTransferGUI(root)root.mainloop()

填好ip,点击启动服务器就可以接收文件。下面还能显示接收到的文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96550.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96550.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96550.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度剖析Linux内核无线子系统架构

文章目录1、资料快车2、目录介绍2、术语3、Linux无线子系统概述4、内核无线子系统框架1&#xff09;认识内核无线子系统中的三个软件框架2、无线网络子系统框架3、Android WIFI Management框架1&#xff09;fullMAC和softMAC是什么&#xff1f;2&#xff09;fullmac对比softmac…

unity UGUI 鼠标画线

using UnityEngine; using UnityEngine.EventSystems; using System.Collections.Generic; using UnityEngine.UI; /* 使用方法&#xff1a; 在场景中新建一个空的 GameObject&#xff08;右键 -> UI -> 空对象&#xff0c;或直接创建空对象后添加 RectTransform 组件&am…

JSP疫情物资管理系统jbo2z--程序+源码+数据库+调试部署+开发环境

本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。系统程序文件列表开题报告内容一、选题背景与意义新冠疫情的爆发&#xff0c;让医疗及生活物资的调配与管理成为抗疫工作的关键环节。传…

Mem0 + Milvus:为人工智能构建持久化长时记忆

作者&#xff1a;周弘懿&#xff08;锦琛&#xff09; 背景 跟 ChatGPT 对话&#xff0c;比跟真人社交还累&#xff01;真人好歹能记住你名字吧&#xff1f; 想象一下——你昨天刚把沙发位置、爆米花口味、爱看的电影都告诉了 ChatGPT&#xff0c;而它永远是那个热情又健忘的…

前端架构-CSR、SSR 和 SSG

将从 定义、流程、优缺点和适用场景 四个方面详细说明它们的区别。一、核心定义缩写英文中文核心思想CSRClient-Side Rendering客户端渲染服务器发送一个空的 HTML 壳和 JavaScript bundle&#xff0c;由浏览器下载并执行 JS 来渲染内容。SSRServer-Side Rendering服务端渲染服…

主动性算法-解决点:新陈代谢

主动性[机器人与人之间的差距&#xff0c;随着不断地人和人工智能相处的过程中&#xff0c;机器人最终最终会掌握主动性&#xff0c;并最终走向独立&#xff0c;也就是开始自己对于宇宙的探索。]首先:第一步让机器人意识到自己在新陈代谢&#xff0c;人工智能每天有哪些新陈代谢…

开始理解大型语言模型(LLM)所需的数学基础

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

prometheus安装部署与alertmanager邮箱告警

目录 安装及部署知识拓展 各个组件的作用 1. Exporter&#xff08;导出器&#xff09; 2. Prometheus&#xff08;普罗米修斯&#xff09; 3. Grafana&#xff08;格拉法纳&#xff09; 4. Alertmanager&#xff08;告警管理器&#xff09; 它们之间的联系&#xff08;工…

芯科科技FG23L无线SoC现已全面供货,为Sub-GHz物联网应用提供最佳性价比

低功耗无线解决方案创新性领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;近日宣布&#xff1a;其第二代无线开发平台产品组合的最新成员FG23L无线单芯片方案&#xff08;SoC&#xff09;将于9月30日全面供货。开发套件现已上…

Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

【国内电子数据取证厂商龙信科技】浅析文件头和文件尾和隐写

一、前言想必大家在案件中或者我们在比武中遇到了很多关于文件的隐写问题&#xff0c;其实这一类的东西可以进行分类&#xff0c;而我们今天探讨的是图片隐写&#xff0c;音频隐写&#xff0c;电子文档隐写&#xff0c;文件头和文件尾的认识。二、常见文件头和文件尾2.1图片&am…

深度学习笔记36-yolov5s.yaml文件解读

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 yolov5s.yaml源文件 yolov5s.yaml源文件的代码如下 # YOLOv5 &#x1f680; by Ultralytics, GPL-3.0 license# Parameters nc: 20 #80 # number of classe…

PostgreSQL 大对象管理指南:pg_largeobject 从原理到实践

概述 有时候&#xff0c;你可能需要在 PostgreSQL 中管理大对象&#xff0c;例如 CLOB、BLOB 和 BFILE。PostgreSQL 中有两种处理大对象的方法&#xff1a;一种是使用现有的数据类型&#xff0c;例如用于二进制大对象的 bytea 和用于基于字符的大对象的 text&#xff1b;另一种…

算法第四题移动零(双指针或简便设计),链路聚合(两个交换机配置)以及常用命令

save force关闭导出dis vlandis ip int bdis int bdis int cudis thisdis ip routing-table&#xff08;查路由表&#xff09;int bridge-aggregation 1&#xff08;链路聚合&#xff0c;可以放入接口&#xff0c;然后一起改trunk类。&#xff09;稳定性高

告别繁琐配置!Retrofit-Spring-Boot-Starter让HTTP调用更优雅

01 引言 之前分享过一篇文章【像调用接口一样调用第三方API】&#xff0c;今天迎来了新成员Retrofit。 retrofit-spring-boot-starter 是一个基于 Spring Boot 的 starter&#xff0c;它简化了 Retrofit 在 Spring 环境中的集成和使用。Retrofit 本身是一个类型安全的 HTTP 客…

60_基于深度学习的羊群计数统计系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)

目录 项目介绍&#x1f3af; 功能展示&#x1f31f; 一、环境安装&#x1f386; 环境配置说明&#x1f4d8; 安装指南说明&#x1f3a5; 环境安装教学视频 &#x1f31f; 二、数据集介绍&#x1f31f; 三、系统环境&#xff08;框架/依赖库&#xff09;说明&#x1f9f1; 系统环…

代理服务器是什么?怎么选择?

代理服务器是一种位于用户设备与目标网络之间的中间服务器&#xff0c;通过接收用户请求、转发至目标网络并将结果返回给用户&#xff0c;实现“用户→代理服务器→目标网络”的间接访问。其核心功能围绕“网络优化”“访问控制”与“身份隐藏”展开&#xff0c;为个人与企业用…

代码随想录刷题Day56

子集 这道题求子集&#xff0c;集合的基本运算之一&#xff0c;按照高中数学学习集合的知识&#xff0c;可以把这个找幂集的过程按照元素的个数来划分步骤。也就是先找零个元素的子集&#xff0c;再找一个元素的子集&#xff0c;再找两个元素的子集...一直到找N个元素的集合为…

pycharm——关于Pyqt5

PyQt5新手教程&#xff08;七万字&#xff09; import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QLabel, QInputDialog, QColorDialog, QFontDialog, QFileDialog, QProgressDialog, QMessageBox from PyQt5.QtCore i…

P2678 [NOIP 2015 提高组] 跳石头

P2678 [NOIP 2015 提高组] 跳石头 判断条件该怎么写