需求:

  1. 用户加密认证
  2. 允许同时多用户登录
  3. 每个用户有自己的家目录 ,且只能访问自己的家目录
  4. 对用户进行磁盘配额,每个用户的可用空间不同
  5. 允许用户在ftp server上随意切换目录
  6. 允许用户查看当前目录下文件
  7. 允许上传和下载文件,保证文件一致性
  8. 文件传输过程中显示进度条
  9. 附加功能:支持文件的断点续传

client:

  1. #coding:utf-8
  2. import socket
  3. import json
  4. import os
  5. #client.connect(('192.168.16.200',9999))
  6.  
  7. class FtpClient(object):
  8. def __init__(self):
  9. self.client = socket.socket()
  10. def help(self):
  11. msg = '''
  12. ls
  13. pwd
  14. cd ../..
  15. get filename
  16. put filename
  17. '''
  18. print(msg)
  19. def connect(self,ip,port):
  20. self.client.connect((ip, port))
  21. def interactive(self):
  22. #self.authenticate()
  23. while True:
  24. cmd = input(">>").strip()
  25. if len(cmd) ==0:continue
  26. cmd_str = cmd.split()[0]
  27. if hasattr(self,"cmd_%s" % cmd_str):
  28. func = getattr(self,"cmd_%s" % cmd_str)
  29. func(cmd)
  30. else:
  31. self.help()
  32. def cmd_put(self,*args):
  33. cmd_split = args[0].split()
  34. if len(cmd_split) >1:
  35. filename = cmd_split[1]
  36. if os.path.isfile(filename):
  37. filesize = os.stat(filename).st_size
  38. msg_dic = {
  39. "action": "put",
  40. "filename":filename,
  41. "size": filesize,
  42. "overridden":True
  43. }
  44. self.client.send( json.dumps(msg_dic).encode("utf-8") )
  45. print("send",json.dumps(msg_dic).encode("utf-8") )
  46. #防止粘包,等服务器确认
  47. server_response = self.client.recv(1024)
  48. f = open(filename,"rb")
  49. for line in f:
  50. self.client.send(line)
  51. else:
  52. print("file upload success...")
  53. f.close()
  54.  
  55. else:
  56. print(filename,"is not exist")
  57. def cmd_get(self):
  58. pass
  59.  
  60. ftp = FtpClient()
  61. ftp.connect("localhost",9999)
  62. ftp.interactive()

server:

  1. import socketserver
  2. import json,os
  3. class MyTCPHandler(socketserver.BaseRequestHandler):
  4.  
  5. def put(self,*args):
  6. '''接收客户端文件'''
  7. cmd_dic = args[0]
  8. filename = cmd_dic["filename"]
  9. filesize = cmd_dic["size"]
  10. if os.path.isfile(filename):
  11. f = open(filename + ".new","wb")
  12. else:
  13. f = open(filename , "wb")
  14.  
  15. self.request.send(b"200 ok")
  16. received_size = 0
  17. while received_size < filesize:
  18. data = self.request.recv(1024)
  19. f.write(data)
  20. received_size += len(data)
  21. else:
  22. print("file [%s] has uploaded..." % filename)
  23.  
  24. def handle(self):
  25. while True:
  26. try:
  27. self.data = self.request.recv(1024).strip()
  28. print("{} wrote:".format(self.client_address[0]))
  29. print(self.data)
  30. cmd_dic = json.loads(self.data.decode())
  31. action = cmd_dic["action"]
  32. if hasattr(self,action):
  33. func = getattr(self,action)
  34. func(cmd_dic)
  35.  
  36. except ConnectionResetError as e:
  37. print("err",e)
  38. break
  39. if __name__ == "__main__":
  40. HOST, PORT = "localhost", 9999
  41. # Create the server, binding to localhost on port 9999
  42. server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
  43. server.serve_forever()

python socketserver 实现 ftp功能的更多相关文章

  1. python网络编程--socketserver 和 ftp功能简单说明

    1. socketserver 我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也 ...

  2. python socketserver ftp上传功能

    一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...

  3. 【Python学习 】Python实现的FTP上传和下载功能

    一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...

  4. socketserver实现FTP

    功能: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 ...

  5. web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架

    基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架   by:授客 QQ:1033553122     博客:http://blog.sina.com.cn/ishou ...

  6. Atitit php java python nodejs错误日志功能的比较

    Atitit php  java  python  nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...

  7. Python实现进度条功能

    Python实现进度条功能 import sys, time def progress(percent, width=50): # 设置进度条的宽度 if percent >= 100: # 当 ...

  8. python之实现ftp上传下载代码(含错误处理)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...

  9. Python+USB+Vnet+FTP传输文件开发记录

    做一个Python+USB+Vnet+FTP传输文件开发记录

随机推荐

  1. python格式化输出的三种形式

    法一: list_a = [1, 2, 3] str_b = 'aaa' string = "There are two contents:%s, %s" % (list_a, s ...

  2. Graph & Trees3 - 二分图

    \[二分图略解\] \[By\;TYQ\] 二分图定义: \(f(i,L) = [a \in L\;\text{&}\;\forall b \in a.to \;\text{,}\; b \n ...

  3. 1016D.Vasya And The Matrix#矩阵存在

    题目出处:http://codeforces.com/contest/1016/problem/D #include<iostream> #define ll long long int ...

  4. 微信小程序java8 java7 java6 encryptedData 解密 异常处理

    使用java8 java7  java6 解密微信小程序encryptedData可以回遇到一些错误 1.java.security.NoSuchAlgorithmException: Cannot ...

  5. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:读取MNIST手写图片数据写入的TFRecord文件

    import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...

  6. Java和Mysql中的数据类型

    1.mysql中的基本类型 1.整数: tinyint:1个字节   -128~127 smallint: 2个字节  -32768~32767 int :  4个字节 bigint:  8个字节 2 ...

  7. 使用node 做静态文件服务器

    # 1. 使用server-static 包 使用node可以非常快速的方法把指定目录共享出去 前提条件:安装了node,附带有npm 要托管的文件目录为 /root/www # 先创建一个目录用来存 ...

  8. python脚本实现自动安装nginx

    本文python脚本实现自动化安装是源码安装.实现任意版本安装,默认版本是1.13.11,也可以更改默认版本,手动配置安装目录. 环境:Ubuntu16.04,python3以上版本,Ubuntu自带 ...

  9. QLIKVIEW-日期格式,数字格式写法

    LOAD T_SAL_ORDER.LE_ID, [T_SAL_ORDER.LCY CODE], T_SAL_ORDER.SYSTEM, T_SAL_ORDER.#DataDateTime, T_SAL ...

  10. idea常用快捷键(对于新手不建议切换使用eclipse)

    查看方法实现:ctrl+alt+鼠标实现父类方法:ctrl+i查看方法的具体实现:ctrl+alt(鼠标再点击方法)快速导包:alt+enter格式化:Ctrl+Alt+L格式化当前行:ctrl+sh ...