Python3之ftp下载简单代码

来源:互联网 发布:php连不上mysql数据库 编辑:程序博客网 时间:2024/06/12 01:18

服务端

import osimport socketimport sysimport structfrom multiprocessing import Processdef get(filepath):    '''    下载功能    :return:    '''    with open(filepath, 'rb') as f:        for line in f:            yield linethis_module = sys.modules[__name__]phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)phone.bind(('127.0.0.1', 8081))phone.listen(5)while 1:    conn, addr = phone.accept()    while 1:        try:            data = conn.recv(8092)            cmd, file_path = data.decode('utf-8').split()            print(os.path.getsize(file_path))            file_path_list = os.path.split(file_path.strip())            print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')            if os.path.exists(os.path.join(file_path_list[0], file_path_list[1])):                res = struct.pack('i', os.path.getsize(file_path))                conn.send(res)                if hasattr(this_module, cmd):                    func = getattr(this_module, cmd)                    g = func(os.path.join(file_path_list[0], file_path_list[1]))                    for i in g:                        conn.send(i)                        # # 定制报头                        # header_dict = {                        #                        #     'total_size': 12,                        #     'filename': None                        # }                        # header_bytes = json.dumps(header_dict).encode('utf-8')                        # # 发送报头长度                        # header_len = struct.pack('i', len(header_bytes))                        # conn.send(header_len)                        # # 发送报头                        # conn.send(header_bytes)                        # 发送数据部分        except Exception:            break    conn.close()phone.close()

客户端

import socketimport structphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.connect(('127.0.0.1', 8081))def get_to_file(data):    '''    获取文件内容    :param data:    :return:    '''    with open(r'c:\users\quincy_c\desktop\wo.mp3', 'ab') as f:        f.write(data)''''''# =========实现打印进度条函数==========import sysimport timedef progress(percent, width=50):    if percent >= 100:        percent = 100    show_str = ('[%%-%ds]' % width) % (int(width * percent / 100) * "$")  # 字符串拼接的嵌套使用    print("\r%s %d%%" % (show_str, percent), end='\n', file=sys.stdout, flush=True)    # print()# =========应用==========# data_size = 3030333# recv_size = 0# while recv_size < data_size:#     time.sleep(0.001)  # 模拟数据的传输延迟#     recv_size += 1024  # 每次收1024##     recv_per = int(100 * (recv_size / data_size))  # 接收的比例#     progress(recv_per, width=30)  # 进度条的宽度30''''''while 1:    # get ‪C:\Users\Quincy_C\Desktop\qaz.txt    cmd = input('请输入>>:').strip()    if not cmd: continue    cmd_list = cmd.split()    filepath = cmd_list[1]    phone.send(cmd.encode('utf-8'))    header = phone.recv(4)    data_size = struct.unpack('i', header)[0]    recv_size = 0    while recv_size < data_size:        # print('开始接收数据--->')        data = phone.recv(10240)        get_to_file(data)        recv_size += len(data)        recv_per = int(100 * (recv_size / data_size))  # 接收的比例        progress(recv_per, width=30)  # 进度条的宽度30        # # 接收报头长度        # res = phone.recv(4)        # # 对报头长度解压        # header_size = struct.unpack('i', res)[0]        # # 接收报头长度的内容        # header_bytes = phone.recv(header_size).decode('utf-8')        # # 对报头字典进行反序列化        # header_json = json.load(header_bytes)        # # 获取数据长度        # data_size = header_json['total_size']        #        # # 根据报头数据长度对数据进行接收        # recv_size = 0        # total_data = b''        # while recv_size < data_size:        #     data_recv = phone.recv(1024)        #     if (data_size - len(data_recv)) < 1024:        #         left_data = phone.recv(data_size - len(data_recv))        #         total_data += left_data        #     total_data += data_recv        #     recv_size += len(data_recv)        #        # print(total_data.decode('gbk'))phone.close()

简单的实现了下载,很多地方需要完善,主要使用了生成器,还有一个简单的进度条,记录一下,后续会继续优化,要使用该功能,必须输入:
get ‪C:\Users\Quincy_C\Desktop\qaz.txt这种形式。

原创粉丝点击