zoukankan      html  css  js  c++  java
  • FTP服务器之下载

    1.SERVER端

    __author__ = 'alex'
    #coding:utf-8
    import socket
    import os
    import sys
    import json
    
    
    def process_bar(num,total):
        percent = float(num)/float(total)
        per_int = int(percent*100)
        # print (percent,per_int)
        # print (">"*per_int + "%d%%" %(per_int+1))
        temp = "
    %d%%" %(per_int)
        sys.stdout.write(temp)
        sys.stdout.flush()
    
    ip_port = ('127.0.0.1',8011)
    sk = socket.socket()
    sk.bind(ip_port)
    sk.listen(5)
    # print (os.path.dirname(__file__))
    print ("服务端启动...")
    file_info = {}
    
    while True:
        conn,addr = sk.accept()
        file_path = conn.recv(1024)
        file_path_str = str(file_path,'utf8')
        file_name = file_path_str.split('\')[-1]
        print (file_path_str)
        if os.path.exists(file_path_str):
            conn.sendall(bytes('2003','utf8'))      #告知客户端,服务器文件存在,可以下载
            conn.recv(1024)
            file_size = os.stat(file_path).st_size
            file_info['file_name'] = file_name
            file_info['file_size'] = file_size
            file_info_json = json.dumps(file_info)
            conn.sendall(bytes(file_info_json,"utf8"))
    
            client_info_recv = conn.recv(1024)
            client_info_recv_str = str(client_info_recv,'utf8')
            print (client_info_recv_str)
            client_repose_code = client_info_recv_str.split('|')[0]
            client_file_size = client_info_recv_str.split('|')[1]
            client_repose_code_int = int(client_repose_code)
            client_file_size_int = int(client_file_size)
            print (client_repose_code_int,client_file_size_int)
    
            if client_repose_code_int == 2004:      #客户端已经有了这个文件
                print ("客户端存在这个文件,现在开始断点续传...")
                file_obj = open(file_path_str,'rb')
                file_obj.seek(client_file_size_int)
                while client_file_size_int < file_size:
                        file_read = file_obj.read(1024)
                        conn.sendall(file_read)
                        client_file_size_int += len(file_read)
                        process_bar(client_file_size_int,file_size)
                file_obj.close()
    
            else :
                print ("客户端不存在这个文件,现在开始下载...")
                file_obj = open(file_path_str,'rb')
                while client_file_size_int < file_size:
                    file_read = file_obj.read(1024)
                    conn.sendall(file_read)
                    client_file_size_int += len(file_read)
                    process_bar(client_file_size_int,file_size)
                file_obj.close()
    
    conn.close()

    2.CLIENT端

    __author__ = 'alex'
    #coding:utf-8
    import socket
    import os
    import sys
    import json
    
    def process_bar(num,total):
        percent = float(num)/float(total)
        per_int = int(percent*100)
        # print (percent,per_int)
        # print (">"*per_int + "%d%%" %(per_int+1))
        temp = "
    %d%%" %(per_int)
        sys.stdout.write(temp)
        sys.stdout.flush()
    
    FILE_PATH = "D:\ftpRio.explorer.rmvb"         #你需要到服务器上去取得文件的目录
    FILE_NAME = FILE_PATH.split('\')[-1]
    print (FILE_NAME)
    
    ip_port = ('127.0.0.1',8011)
    sk = socket.socket()
    sk.connect(ip_port)
    file_info = {}
    print ("客户端启动...")
    
    while True:
        sk.sendall(bytes(FILE_PATH,"utf8"))
        file_exist_recv = sk.recv(1024)
        file_exist_recv_str = str(file_exist_recv,'utf8')
        if file_exist_recv_str == '2003':
            print ("服务器端文件存在,可以下载...")
            sk.sendall(bytes("ok",'utf8'))
            file_info_bytes = sk.recv(1024)
            file_info_str = str(file_info_bytes,"utf8")
            file_info = json.loads(file_info_str)
            server_file_name = file_info.get('file_name')
            server_file_size = file_info.get('file_size')
            print (file_info)
    
            if os.path.exists(server_file_name):
                client_file_size = os.stat(server_file_name).st_size
                print ("客户端已经有这个文件!")
                inp = input("文件是否需要续传?按y确认...")
                if inp == 'y':
                    sk.sendall(bytes(str(2004)+'|'+str(client_file_size),'utf8'))    #客户端已经有了这个文件
    
                client_file = open(server_file_name,'ab')
                while client_file_size < server_file_size:
                    try:
                        data=sk.recv(1024)
                        if not data:
                            raise Exception
                    except Exception:
                        break
    
                    client_file.write(data)
                    client_file_size += len(data)
                    process_bar(client_file_size,server_file_size)
                client_file.close()
    
            else:                   #客户端没有这个文件
                client_file_size = 0
                # sk.sendall(bytes(str(2005|client_file_size),'utf8'))
                sk.sendall(bytes(str(2005)+'|'+str(client_file_size),'utf8'))
                client_file = open(server_file_name,'wb')
                while client_file_size < server_file_size:
                    try:
                        data=sk.recv(1024)
                        if not data:
                            raise Exception
                    except Exception:
                        break
    
                    client_file.write(data)
                    client_file_size += len(data)
                    process_bar(client_file_size,server_file_size)
                client_file.close()
    
        else:
            print ("服务器端文件不存在,请查看文件输入是否正确!")
    sk.close()
  • 相关阅读:
    输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少
    有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串
    写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
    有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
    有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图8.43 写一函数实现以上功能,在主函数中输人n个整数和输出调整后的n个数
    输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换
    LOJ#3271. 「JOISC 2020 Day1」建筑装饰 4 DP+找规律
    LOJ#3160. 「NOI2019」斗主地 打表+拉格朗日插值
    CF1386C Joker 双指针+动态树
    LuoguP2605 [ZJOI2010]基站选址 线段树优化DP
  • 原文地址:https://www.cnblogs.com/python-study/p/5815610.html
Copyright © 2011-2022 走看看