多任务-文件下载器
原理:根据tcp客户端与服务端的socket交互传输数据
tcp服务端:filedown_server.py
import socket
import os
import threading
def down_file(service_client_socket):
# 代码执行到说明解阻塞,说明连接建立成功
file_name_data = service_client_socket.recv(1024)
# 解码数据
file_name = file_name_data.decode("gbk")
print(file_name)
if os.path.exists("C:/Users/gqr/Desktop/" + file_name):
# 文件存在
with open("C:/Users/gqr/Desktop/" + file_name, "rb") as file:
# 读取文件数据
while True:
file_data = file.read(1024)
if file_data:
# 发送文件数据给客户端
service_client_socket.send(file_data)
else:
print(ip_port, '文件传输完成')
break
else:
print("文件不存在")
# 终止和客户端服务
service_client_socket.close()
if __name__ == '__main__':
# 创建tcp服务端socket
tcp_serve_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置socket选项,防止程序退出端口不立即释放的问题
tcp_serve_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口
tcp_serve_socket.bind(("", 6500))
# 设置监听,把主动套接字改成被动套接字,被动套接字只能接收客户端的连接请求,不能收发消息
tcp_serve_socket.listen(128)
# 循环接收客户端的连接请求, 提示:现在的下载是同步下载,一个用户下载完成以后另外一个用户才能下载
while True:
# 接收客户端的连接请求
service_client_socket, ip_port = tcp_serve_socket.accept()
print('客户端:', ip_port, '建立连接')
# 开辟线程
sub_thread = threading.Thread(target=down_file, args=(service_client_socket,))
sub_thread.start()
# 终止提供处理连接请的服务
tcp_serve_socket.close()
tcp客户端:filedown_client.py
import socket
if __name__ == '__main__':
# 创建tcp客户端socket
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接
tcp_client_socket.connect(("192.168.138.123", 6500))
# 获取用户输入文件名
file_name = input("请输入您要下载的文件名:")
# 使用gbk进行编码
file_name_data = file_name.encode("gbk")
# 代码执行到此,说明连接建立成功
tcp_client_socket.send(file_name_data)
with open("C:/Users/gqr/Desktop/素材/ " + file_name, "wb") as file:
# 循环接收服务端发送的文件二进制数据
while True:
# 获取服务端文件数据
file_data = tcp_client_socket.recv(1024)
if file_data:
# 写入到指定文件
file.write(file_data)
else:
break
# 关闭socket
tcp_client_socket.close()