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()
时间: 2024-10-08 10:29:01

FTP服务器之下载的相关文章

服务器的设计与实现(三)——FTP服务器之设计与实现

在实现了Http服务器之后,本人打算再实现一个Ftp服务器.由于Ftp协议与Http一样都位于应用层,所以实现原理也类似.在这里把实现的原理和源码分享给大家. 首先需要明确的是Ftp协议中涉及命令端口和数据端口,即每个客户端通过命令端口向服务器发送命令(切换目录.删除文件等),通过数据端口从服务器接收数据(目录列表.下载上传文件等).这就要求对每个连接都必须同时维护两个端口,如果使用类似于上一篇文章中的多路IO就会复杂很多,因此本文采用了类似Apache的多进程机制,即对每个连接创建一个单独的进

ftp服务器之vsftp

一.简介 文件传输协议(FTP,File Transfer Protocol),即能够让用户在互联网中上传.下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件传输则需要FTP服务端和FTP客户端的配合才行. 通常用户使用FTP客户端软件向FTP服务器发起连接并发送FTP指令,服务器收到用户指令后将执行结果返回客户端. FTP协议占用两个端口号: 21端口:命令连接,用于接收客户端执行的FTP命令. 20端口:数据连接,用于上传.下载文件数据. FTP数据传输的类型: 主

计算机网络系列:搭建FTP服务器之第一篇:安装IIS信息服务

学网络课,那天上机课学到了怎么制作一个FTP服务器,然后就跟着老师做了下,其实很简单,但有一些细节性的稍微麻烦一点,还有一些配置文件需要下载,这里一并都放上来了. 首先,你得准备一个win 2003 server或者win xp的系统,然后用虚拟机把系统跑起来,下边我给两个资源的地址供大家下载(本人用的是win2003server): win 2003 server系统:http://pan.baidu.com/s/1hqvdOLA,(我放在了百度网盘里边) IIS配置工具:http://dow

计算机网络系列:搭建FTP服务器之第二篇:搭建FTP站点

看本篇博文的时候,默认读者已经度过上一篇博文:已经在服务器上边安装好了IIS服务. 接着上一篇的,我们继续说,既然已经安装好了IIS服务,我们就要开始搭建FTP站点了: 开始-->管理工具-->Internet 信息服务(IIS)管理器,会出现如下所示的界面: 在FTP站点,右键选择"新建-->FTP站点": 然后"下一步" (IP地址为这个虚拟机的IP地址,可以在dos界面通过:ipconfig/all 命令查询. 另外,还需要在虚拟机设置:虚拟

用三种不同的方法访问Linux系统上的FTP服务过程详解

今天向大家介绍一下,如何在Linux上配置ftp服务,并且使用三种不同的方式访问Linux系统上的FTP服务. 实验环境:一台windows7系统虚拟机,一台Linux系统虚拟机. 实验目的:搭建FTP文件传输服务,并进行匿名访问.虚拟用户访问和本地用户验证. 匿名访问用户名为ftp或anonymous,提供任意密码(包括空密码)都可以通过服务器认证 安装软件包,关闭防火墙和关闭selinux功能. 在ftp服务中创建一个wen.txt文件 测试(window7) 匿名登录ftp服务 从ftp服

解决FileZilla访问手机ftp服务只能删除浏览文件不能下载文件的问题

用了Linux系统之后,很多资源都不方便获取, 因为很多资料都是放在百某某盘上面. 无意中看到我手机有FTP服务,想到我电脑装有FileZilla,可以访问手机了 然后就连接上了. 但是浏览的时候发现第一个问题,乱码问题.不用说,肯定是编码搞得鬼, 然后搜了一下手机一般是UTF-8字符集,所以改一下即可. 1.改字符集 选择中间的UTF-8. 2.增加同步浏览,即可下载 一开始不能下载,我还想修改文件的权限,但是修改不成功,后来了解到,使用同步浏览功能就可以了. 点击倒数第二个图标 这样就可以了

解析FTP服务(文件的下载、上传)

FTP服务和文件共享服务的区别在于,文件共享服务只可以用于局域网,而FTP服务既可以用于局域网也可以用于广域网.如何搭建FTP: 第一步:服务管理器第二步:点击添加角色第三步:选择Web服务第四步:在角色服务界面添加FTP服务器(如果不添加此服务则无法使用FTP功能)第五步:点击安装(操作如下)进入服务管理器IIS管理器第一步:右键点击服务器第二步:选择添加FTP站点第三步:输入站点名称(例:yun),选择路径:E:\yunsit作为站点供上传和下载(此文件夹提前创建好)第四步:绑定和SSL设置

FTP服务搭建及上传下载实验(干货,可跟着一起实操)

文件传输协议 文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议.??FTP允许用户以文件操作的方式(如文件的增.删.改.查.传送等)与另一主机相互通信.然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件.目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式. 事先准备 一台装有Windows Sever的服务器.一台客户机 目的 通过FTP

CentOS 7通过FTP服务下载服务器资源(福利!!!)

实验环境: VMware虚拟机软件Service 2016系统的虚拟机(服务器)CentOS 7 系统的虚拟机(客户端) 实验目的: 使用CentOS 7通过FTP服务 下载服务器上的软件包. 实验步骤: 一.创建FTP服务 1.在服务器中打开服务器管理器,在再仪表板中选择添加角色和功能选项.2.跳转下一步至服务器角色项,找到Web服务器功能并添加.3.点击下一步来到角色服务项,选择添加FTP服务器,再次点击下一步进入安装.4.安装好后,在开始菜单里找到IIS管理器并双击进入.5.在IIS管理器