FTP服务器之下载

Posted Alex0425

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 = "\r%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 = "\r%d%%" %(per_int)
    sys.stdout.write(temp)
    sys.stdout.flush()

FILE_PATH = "D:\\ftp\Rio.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()

 

以上是关于FTP服务器之下载的主要内容,如果未能解决你的问题,请参考以下文章

FTP服务器之下载

java Ftp上传创建多层文件的代码片段

FTP部署之pure-ftpd

linux 之ftp

Linux之FTP

Linux学习笔记之十————Linux常用服务器构建之ftp服务器