一,程序设计思路
文件快传是指一个设备将文件快速传至另一个设备,而这往往需要中间有个服务器做中转,但这也会影响传输速度,其实我们可以不用这个中转站
当我们需要向其他设备传文件时
我们的电脑就可以当服务器,向其他设备发送文件,而其他设备当客户端请求服务器
当我们需要接收其他设备传过来的文件时
我们用requests请求对方的flask,传输文件
这样一来文件的传输速度就是双方网速的极限了,前提是需要保证您的ip地址可以使用及电脑5080端口不被其他程序使用
二,多线程部分
t1 = threading.Thread(target=user_tk)
t1.start()
print(ip)
app.run(host="0.0.0.0",port=5080)
众所周知tkinter或者flask的使用都会使程序暂停,也就是说一个线程里面不能同时有这俩老虎
所以我们使用多线程来避免这个尴尬,当然tkinter是用户的图形化操作界面,负责接受用户向程序下达的命令,而flask是对用户下达的命令做出响应,这样一来两个线程必须进行通信
三,线程之间的通信问题
lock = threading.Lock()
我们使用线程锁锁住资源当一个线程更改资源的时候对资源上锁,其他线程需要等待至这个线程完成对程序的更改释放资源后才能对他进行更改,访问资源则不需要锁
四,flask模块的使用
@app.route('/<password>')
def get_file(password):
catalogue = Docking_table.setdefault(password)
catalogue,temp = os.path.split(catalogue)
filename_sever,extension = os.path.splitext(temp)
filename_sever = filename_sever + extension
return_body = make_response(send_from_directory(catalogue, filename_sever, as_attachment=True))
return_body.headers["Content-Disposition"] = "attachment; filename={}".format(filename_sever.encode().decode('latin-1'))
return return_body
@app.route('/name/<password>')
def get_table(password):
catalogue = Docking_table.setdefault(password)
catalogue,temp = os.path.split(catalogue)
filename_sever,extension = os.path.splitext(temp)
filename_sever = filename_sever + extension
return filename_sever
我们提前生成一个字典当点击上传文件的时候将此资源解锁,将用户选择的路径及随机生成的密钥写入字典,然后上锁
当接收端使用requests访问本电脑时在链接里加入密钥,flask访问此字典找出密钥对应的文件路径,返回文件内容
五,requests的使用
接收tkinter传回的参数访问对方的flask接收文件名和文件内容
六,tkinter的使用
tkinter界面
子窗口界面
我们使用text和entry处理程序返回值和用户输入的命令
text_1.insert("end", "你好,欢迎使用文件快传,尝试键入help获取命令帮助\n等待命令....")
使用以上代码返回不同的信息
六,程序运行图
可以使用本机文件快传也可以使用局域网如果您的ip可以被公网访问则可以实现远程文件快传
七,程序源代码
博客地址:https://blog.csdn.net/beginner2021
源代码下载地址:文件快传(使用tkinter+flask+requests+threading)此文件为使用这些模块的实例程序(加注释)-Python文档类资源-CSDN下载