多任务-文件下载器

                                                                        多任务-文件下载器

原理:根据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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值