需求:

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

client:

#coding:utf-8
import socket
import json
import os
#client.connect(('192.168.16.200',9999)) class FtpClient(object):
def __init__(self):
self.client = socket.socket()
def help(self):
msg = '''
ls
pwd
cd ../..
get filename
put filename
'''
print(msg)
def connect(self,ip,port):
self.client.connect((ip, port))
def interactive(self):
#self.authenticate()
while True:
cmd = input(">>").strip()
if len(cmd) ==0:continue
cmd_str = cmd.split()[0]
if hasattr(self,"cmd_%s" % cmd_str):
func = getattr(self,"cmd_%s" % cmd_str)
func(cmd)
else:
self.help()
def cmd_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
msg_dic = {
"action": "put",
"filename":filename,
"size": filesize,
"overridden":True
}
self.client.send( json.dumps(msg_dic).encode("utf-8") )
print("send",json.dumps(msg_dic).encode("utf-8") )
#防止粘包,等服务器确认
server_response = self.client.recv(1024)
f = open(filename,"rb")
for line in f:
self.client.send(line)
else:
print("file upload success...")
f.close() else:
print(filename,"is not exist")
def cmd_get(self):
pass ftp = FtpClient()
ftp.connect("localhost",9999)
ftp.interactive()

server:

import socketserver
import json,os
class MyTCPHandler(socketserver.BaseRequestHandler): def put(self,*args):
'''接收客户端文件'''
cmd_dic = args[0]
filename = cmd_dic["filename"]
filesize = cmd_dic["size"]
if os.path.isfile(filename):
f = open(filename + ".new","wb")
else:
f = open(filename , "wb") self.request.send(b"200 ok")
received_size = 0
while received_size < filesize:
data = self.request.recv(1024)
f.write(data)
received_size += len(data)
else:
print("file [%s] has uploaded..." % filename) def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
cmd_dic = json.loads(self.data.decode())
action = cmd_dic["action"]
if hasattr(self,action):
func = getattr(self,action)
func(cmd_dic) except ConnectionResetError as e:
print("err",e)
break
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()

最新文章

  1. 萌新笔记——linux下查看内存的使用情况
  2. 【Java并发编程实战】-----&ldquo;J.U.C&rdquo;:Phaser
  3. UIPickerView去掉背景上的黑线
  4. Linux 如何实现 VLAN - 每天5分钟玩转 OpenStack(12)
  5. Behind RabbitMQ Exchange Types
  6. C#图片处理---基础
  7. 使用SQL对数据进行整理
  8. UVa10603 Fill
  9. 在VS.NET中根据条件设置不同的MainForm
  10. 新浪旗下的SAE云服务入门
  11. JQuery 表单验证--jquery validation
  12. 一句python,一句R︱模块导入与查看、数据读写出入、数据查看函数、数据类型、遍历文件
  13. [Postman]证书(13)
  14. day14,函数的使用方法:生成器表达式,生成器函数
  15. 【Algorithm】自底向上的归并排序
  16. HTML5无刷新修改URL
  17. python实现常量const
  18. 多线程-threading
  19. AES算法工具类
  20. shell 判断是否是目录

热门文章

  1. 有几个水洼(DFS)
  2. gff文件提取cds
  3. win10环境下pycharm成功安装torch,解决报错:from torch._C import * ImportError: DLL load failed: 找不到指定的模块
  4. 基于JSP开发医院预约挂号系统 Java源码
  5. 关于mysql数据库连接异常处理
  6. jexus+.netcore+identityserver4 部署支持ssl(https)
  7. 用最小的空间复杂度找出一个长度为n的数组且数据中的元素是[0,n-1]中任一个重复的数据。
  8. pandas(一)
  9. linux epoll 任务队列多线程模型
  10. 解决 Win7 远程桌面 已停止工作的问题