python3实现ftp服务功能的实例内容

  • 时间:
  • 844人关注

这篇文章主要为大家详细介绍了python3实现ftp服务功能,客户端的相应代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,另外这篇文章主要知识点是关于python3、ftp、客户端、python3的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

教程详情电子资料
  • 教程类别:python3
  • 编辑整理:边泰鸿
  • 教程字数:6385字节
  • 阅读时间:大概19分钟
  • 下载本教程(DOC版)
  • 笨办法学python3
  • Python3.7从零开始学
  • Python3面向对象编程
  • Python3.2.3官方文档
  • Python3.6零基础入门与实战
  • 本文实例为大家分享了python3实现ftp服务功能的具体代码,供大家参考,具体内容如下

    客户端 main代码:

    #Author by Andy
    #_*_ coding:utf-8 _*_
    '''
    This program is used to create a ftp client
    
    '''
    import socket,os,json,time,hashlib,sys
    class Ftp_client(object):
     def __init__(self):
      self.client = socket.socket()
     def help(self):
      msg = '''useage:
      ls
      pwd
      cd dir(example: / .. . /var)
      put filename
      rm filename
      get filename
      mkdir directory name
      '''
      print(msg)
     def connect(self,addr,port):
      self.client.connect((addr,port))
     def auth(self):
      m = hashlib.md5()
      username = input("请输入用户名:").strip()
    
      m.update(input("请输入密码:").strip().encode())
      password = m.hexdigest()
      user_info = {
       'action':'auth',
       'username':username,
       'password':password}
      self.client.send(json.dumps(user_info).encode('utf-8'))
      server_response = self.client.recv(1024).decode()
      # print(server_response)
      return server_response
     def interactive(self):
      while True:
       msg = input(">>>:").strip()
       if not msg:
        print("不能发送空内容!")
        continue
       cmd = msg.split()[0]
       if hasattr(self,cmd):
        func = getattr(self,cmd)
        func(msg)
       else:
        self.help()
        continue
     def put(self,*args):
      cmd_split = args[0].split()
      if len(cmd_split) > 1:
       filename = cmd_split[1]
       if os.path.isfile(filename):
        filesize = os.stat(filename).st_size
        file_info = {
         "action":"put",
         "filename":filename,
         "size":filesize,
         "overriding":'True'
        }
        self.client.send( json.dumps(file_info).encode('utf-8') )
        #防止粘包,等待服务器确认。
        request_code = {
         '200': 'Ready to recceive data!',
         '210': 'Not ready to received data!'
        }
        server_response = self.client.recv(1024).decode()
        if server_response == '200':
         f = open(filename,"rb")
         send_size = 0
         start_time = time.time()
         for line in f:
          self.client.send(line)
          send_size += len(line)
          send_percentage = int((send_size / filesize) * 100)
          while True:
           progress = ('\r已上传%sMB(%s%%)' % (round(send_size / 102400, 2), send_percentage)).encode(
            'utf-8')
           os.write(1, progress)
           sys.stdout.flush()
           time.sleep(0.0001)
           break
         else:
          end_time = time.time()
          time_use = int(end_time - start_time)
          print("\nFile %s has been sent successfully!" % filename)
          print('\n平均下载速度%s MB/s' % (round(round(send_size / 102400, 2) / time_use, 2)))
          f.close()
        else:
         print("Sever isn't ready to receive data!")
         time.sleep(10)
         start_time = time.time()
         f = open(filename, "rb")
         send_size = 0
         for line in f:
           self.client.send(line)
           send_size += len(line)
           # print(send_size)
           while True:
            send_percentage = int((send_size / filesize) * 100)
            progress = ('\r已上传%sMB(%s%%)' % (round(send_size / 102400, 2), send_percentage)).encode(
             'utf-8')
            os.write(1, progress)
            sys.stdout.flush()
            # time.sleep(0.0001)
            break
         else:
          end_time = time.time()
          time_use = int(end_time - start_time)
          print("File %s has been sent successfully!" % filename)
          print('\n平均下载速度%s MB/s' % (round(round(send_size / 102400, 2) / time_use, 2)))
          f.close()
       else:
        print("File %s is not exit!" %filename)
      else:
       self.help()
     def ls(self,*args):
      cmd_split = args[0].split()
      # print(cmd_split)
      if len(cmd_split) > 1:
       path = cmd_split[1]
      elif len(cmd_split) == 1:
       path = '.'
      request_info = {
       'action': 'ls',
       'path': path
      }
      self.client.send(json.dumps(request_info).encode('utf-8'))
      sever_response = self.client.recv(1024).decode()
      print(sever_response)
     def pwd(self,*args):
      cmd_split = args[0].split()
      if len(cmd_split) == 1:
       request_info = {
        'action': 'pwd',
       }
       self.client.send(json.dumps(request_info).encode("utf-8"))
       server_response = self.client.recv(1024).decode()
       print(server_response)
      else:
       self.help()
     def get(self,*args):
      cmd_split = args[0].split()
      if len(cmd_split) > 1:
       filename = cmd_split[1]
       file_info = {
         "action": "get",
         "filename": filename,
         "overriding": 'True'
        }
       self.client.send(json.dumps(file_info).encode('utf-8'))
       server_response = self.client.recv(1024).decode() #服务器反馈文件是否存在
       self.client.send('0'.encode('utf-8'))
       if server_response == '0':
        file_size = int(self.client.recv(1024).decode())
        # print(file_size)
        self.client.send('0'.encode('utf-8')) #确认开始传输数据
        if os.path.isfile(filename):
         filename = filename+'.new'
        f = open(filename,'wb')
        receive_size = 0
        m = hashlib.md5()
        start_time = time.time()
        while receive_size < file_size:
         if file_size - receive_size > 1024: # 还需接收不止1次
          size = 1024
         else:
          size = file_size - receive_size
         data = self.client.recv(size)
         m.update(data)
         receive_size += len(data)
         data_percent=int((receive_size / file_size) * 100)
         f.write(data)
         progress = ('\r已下载%sMB(%s%%)' %(round(receive_size/102400,2),data_percent)).encode('utf-8')
         os.write(1,progress)
         sys.stdout.flush()
         time.sleep(0.0001)
    
        else:
         end_time = time.time()
         time_use = int(end_time - start_time)
         print('\n平均下载速度%s MB/s'%(round(round(receive_size/102400,2)/time_use,2)))
         Md5_server = self.client.recv(1024).decode()
         Md5_client = m.hexdigest()
         print('文件校验中,请稍候...')
         time.sleep(0.3)
         if Md5_server == Md5_client:
          print('文件正常。')
         else:
          print('文件与服务器MD5值不符,请确认!')
       else:
        print('File not found!')
        client.interactive()
      else:
       self.help()
     def rm(self,*args):
      cmd_split = args[0].split()
      if len(cmd_split) > 1:
       filename = cmd_split[1]
       request_info = {
        'action':'rm',
        'filename': filename,
        'prompt':'Y'
       }
       self.client.send(json.dumps(request_info).encode("utf-8"))
       server_response = self.client.recv(10240).decode()
       request_code = {
        '0':'confirm to deleted',
        '1':'cancel to deleted'
       }
    
       if server_response == '0':
        confirm = input("请确认是否真的删除该文件:")
        if confirm == 'Y' or confirm == 'y':
         self.client.send('0'.encode("utf-8"))
         print(self.client.recv(1024).decode())
        else:
         self.client.send('1'.encode("utf-8"))
         print(self.client.recv(1024).decode())
       else:
        print('File not found!')
        client.interactive()
    
    
      else:
       self.help()
     def cd(self,*args):
      cmd_split = args[0].split()
      if len(cmd_split) > 1:
       path = cmd_split[1]
      elif len(cmd_split) == 1:
       path = '.'
      request_info = {
       'action':'cd',
       'path':path
      }
      self.client.send(json.dumps(request_info).encode("utf-8"))
      server_response = self.client.recv(10240).decode()
      print(server_response)
     def mkdir(self,*args):
      request_code = {
       '0': 'Directory has been made!',
       '1': 'Directory is aleady exist!'
      }
      cmd_split = args[0].split()
      if len(cmd_split) > 1:
       dir_name = cmd_split[1]
       request_info = {
        'action':'mkdir',
        'dir_name': dir_name
       }
       self.client.send(json.dumps(request_info).encode("utf-8"))
       server_response = self.client.recv(1024).decode()
       if server_response == '0':
        print('Directory has been made!')
       else:
        print('Directory is aleady exist!')
      else:
       self.help()
     # def touch(self,*args):
    def run():
     client = Ftp_client()
     # client.connect('10.1.2.3',6969)
     Addr = input("请输入服务器IP:").strip()
     Port = int(input("请输入端口号:").strip())
     client.connect(Addr,Port)
     while True:
      if client.auth() == '0':
       print("Welcome.....")
       client.interactive()
       break
      else:
       print("用户名或密码错误!")
       continue
    

    目录结构:

    python3实现ftp服务功能(客户端)

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

    码农之家
    详解Python下ftp上传文件linux服务器

    16小时47分钟前回答

    详解Python下ftp上传文件linux服务器

    模块介绍:

    from ftplib import FTP
     ftp = FTP() #设置变量
     ftp.set_debuglevel(2) #打开调试级别2 显示详细信息
     ftp.connect("IP", "port") #连接ftp, IP和端口
     ftp.log("user", "password") #连接的用户名、密码
     
     ftp.cwd(pathname) #设置FTP当前操作的路径
     ftp.dir() #显示目录下的文件信息
     ftp.nlst() #获取目录下的文件
     ftp.mkd(pathname) #新建远程目录
     ftp.pwd() #返回当前所在位置
     ftp.rmd(dirname) #删除远程目录
     ftp.delete(filename) #删除远程文件
     ftp.rename(from_name, to_name) #修改文件名
     ftp.storbinaly("STOR filename.txt", file_handel, bufsize) # 上传目标文件
     ftp.retrbinaly("RETR filename.txt", file_handel, bufsize) # 上传FTP文件

    功能实现:

    ftp.dir() 能显示目录下的文件信息,考虑到要分别对文件夹个数和文件数目进行统计,文件夹下存在文件夹和文件嵌套;将dir()后的目录信息放入列表,对列表进行操作;进入子文件夹后进行递归调用操作。

     # -*- coding: utf-8 -*-
     
     from ftplib import FTP
     
     ftp = FTP()
     ftp.connect('132.121.xx.xxx', 'xx909')
     ftp.login('crmyun_xxx', 'wyjjjjxJ')
     sum1 = 0
     sum2 = 0
     value = 0
     
     def search_file(start_dir):
      ftp.cwd(start_dir)
      print ftp.pwd()
      dir_res = []
      ftp.dir('.', dir_res.append) #对当前目录进行dir(),将结果放入列表
      for i in dir_res:
       if i.startswith("d"):
        global sum1 
        sum1 += 1
        search_file(ftp.pwd()+"/"+i.split(" ")[-1])
        ftp.cwd('..')
       else:
        global sum2, value
        sum2 += 1
        val = i.split(" ")[-1]
        value += ftp.size(val)
        if ftp.pwd().endswith('/'):    
     #    print ftp.pwd()+val+"  "+str(ftp.size(val))+" B" #打印出每个文件路径和大小
         pass
        else:    
     #    print ftp.pwd()+"/"+val+"  "+str(ftp.size(val))+" B"
         pass
     def sum_file(file_path):
      search_file(file_path)
      print "folder number is "+str(sum1)+", file number is "+str(sum2)+", Totle size is "+str(value)+" B"
      
     
     if __name__ == '__main__':
      sum_file("/apps/crmyun/crmyun_755")

    展示结果:

    详解Python下ftp上传文件linux服务器

    完整上传程序

    Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件,函数列举如下

    ftp登陆连接
    from ftplib import FTP   #加载ftp模块
    ftp=FTP()       #设置变量
    ftp.set_debuglevel(2)    #打开调试级别2,显示详细信息
    ftp.connect("IP","port")   #连接的ftp sever和端口
    ftp.login("user","password")  #连接的用户名,密码
    print ftp.getwelcome()   #打印出欢迎信息
    ftp.cmd("xxx/xxx")    #进入远程目录
    bufsize=1024      #设置的缓冲区大小
    filename="filename.txt"   #需要下载的文件
    file_handle=open(filename,"wb").write #以写模式在本地打开文件
    ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件
    ftp.set_debuglevel(0)    #关闭调试模式
    ftp.quit()      #退出ftp
     
    ftp相关命令操作
    ftp.cwd(pathname)     #设置FTP当前操作的路径
    ftp.dir()       #显示目录下所有目录信息
    ftp.nlst()      #获取目录下的文件
    ftp.mkd(pathname)     #新建远程目录
    ftp.pwd()       #返回当前所在位置
    ftp.rmd(dirname)     #删除远程目录
    ftp.delete(filename)    #删除远程文件
    ftp.rename(fromname, toname)#将fromname修改名称为toname。
    ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件
    ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP文件

    FTP.quit()与FTP.close()的区别

    FTP.quit():发送QUIT命令给服务器并关闭掉连接。这是一个比较“缓和”的关闭连接方式,但是如果服务器对QUIT命令返回错误时,会抛出异常。

    FTP.close():单方面的关闭掉连接,不应该用在已经关闭的连接之后,例如不应用在FTP.quit()之后。

    例:下载、上传文件

    # coding: utf-8
    from ftplib import FTP
    import time
    import tarfile
    import os
    # !/usr/bin/python
    # -*- coding: utf-8 -*-
    
    from ftplib import FTP
    
    def ftpconnect(host, username, password):
     ftp = FTP()
     # ftp.set_debuglevel(2)
     ftp.connect(host, 21)
     ftp.login(username, password)
     return ftp
    
    #从ftp下载文件
    def downloadfile(ftp, remotepath, localpath):
     bufsize = 1024
     fp = open(localpath, 'wb')
     ftp.retrbinary('RETR ' + remotepath, fp.write, bufsize)
     ftp.set_debuglevel(0)
     fp.close()
    
    #从本地上传文件到ftp
    def uploadfile(ftp, remotepath, localpath):
     bufsize = 1024
     fp = open(localpath, 'rb')
     ftp.storbinary('STOR ' + remotepath, fp, bufsize)
     ftp.set_debuglevel(0)
     fp.close()
    
    if __name__ == "__main__":
     ftp = ftpconnect("113.105.139.xxx", "ftp***", "Guest***")
     downloadfile(ftp, "Faint.mp4", "C:/Users/Administrator/Desktop/test.mp4")
     #调用本地播放器播放下载的视频
     os.system('start "C:\Program Files\Windows Media Player\wmplayer.exe" "C:/Users/Administrator/Desktop/test.mp4"')
     uploadfile(ftp, "C:/Users/Administrator/Desktop/test.mp4", "test.mp4")
    
     ftp.quit()

    展开阅读

    上一篇:Python 稀疏矩阵中sparse存储和转换实例讲解

    下一篇:Python配置mysql的详细步骤方法

    相关内容

    • Python获取ftp服务器文件时间的代码和方法

      今天小编就为大家分享一篇Python 获取ftp服务器文件时间的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

      01-24Python 获取ftp服务器文件时间的方法

      阅读更多
    • 如何使用Python搭建FTP服务器

      本篇文章主要介绍了Python搭建FTP服务器的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

      02-12Python搭建FTP服务器的方法示例

      阅读更多
    • Python3零起点教程

      Python3零起点教程

      python3零起点教程 是一套廖雪峰专注于python程序设计方面的电子书,该电子书具有免费,零起点,完整示例等优点,深受广大程序员所青睐。简单易懂的python3教程,非常适合python小白进行学习,需要的朋友可下载试试! 本教程包括Python程序设计的方方面面,首先从Python的安装开始,随后介绍了Python的基础知识和基本概念,包括列表、元组、字符串、字典以及各种语句。然后循序渐进地介绍了一些相对高级的主题,包括抽象、异常、魔法方法、属性、迭代

      大小:11.4 MBPython3

      点击下载
    • Python3程序开发指南

      Python3程序开发指南

      本书全面深入地讲解了Python语言,讲述了构成Python语言的8个关键要素,包含数据类型、控制结构与函数、模块、正则表达式、GUI程序设计等各个方面

      大小:419.2 MBPython

      点击下载
    • Python正则表达式全套笔记(含Python3.10官方文档)

      这是一个Python正则表达式学习笔记文档,涵盖了正则表达式的各个方面,含Python3.10正则表达式官方文档,涉及正则的匹配、规则、各种模式、分组、断言等

      大小:3.51 MBPython正则

      点击下载

    学习笔记

    24小时47分钟前回答

    使用Python操作FTP实现上传和下载的方法

    搭建ftp服务器server端 # -*- coding:utf-8 -*-from pyftpdlib.authorizers import DummyAuthorizerfrom pyftpdlib.handlers import FTPHandlerfrom pyftpdlib.servers import FTPServer# 实例化DummyAuthorizer来创建ftp用户authorizer = DummyAuthorizer()# 参数:用户名,密码,目录,权限authorizer.add_user('admin', '123456', r'C:\Users\Administrator\Desktop\ftp', perm='elradfmwMT')# 匿名登录# authorizer.add_anonymous('/home/nobody')handler = FTPHandlerhandler.authorizer = authorizer# 参数:IP,端口,handlerserver = FTPServer(('0.0.0.0', 2121), handler) #设置为0.0.0.0为本机的IP地址server.serve_forever() 函数释义 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件,函……