**相较上一篇v1的改进版,当前实现了如下功能:
1.上传
2.下载
3.查看server端保存的文件列表
4.上传、下载显示进度条
5.server端将client信息保存为json格式存入本地,实时加载和写入

client code:

#Author :ywq
import socket,os,json,sys
import threading
import timemsg_dic={}
size_dic={}
clac_event=threading.Event()class Scok_Client(object):def __init__(self):self.client=socket.socket()def connect(self,IP,Port):self.client.connect((IP,Port))def usage(self):print('''Usage:action + parameterPut FilenameGet FilenameLscd ../..''')def auth(self):user=input('Input username:')passwd=input('Input passwd:')msg_dic['Username']=usermsg_dic['Password']=passwddef progressbar(self,a,b):percentage = a/bnum = int(percentage*100)view = '\r %d%%[%-100s]%d%%'%(0,'#'*num,100)sys.stdout.write(view)sys.stdout.flush()def interactive(self):while True:self.auth()while True:try:cmd_str=input('Input cmd:')cmd=cmd_str.split()[0]print('Exec action:',cmd )if hasattr(self,'cmd_%s' %cmd) :act=getattr(self,'cmd_%s' %cmd)act(cmd_str)except Exception as e:print('Error:',e)self.usage()def cmd_put(self,*args):cmd,filename=args[0].split()if os.path.isfile(filename):msg_dic['Action']=cmdmsg_dic['Filename']=filenamefile_size=os.path.getsize(filename)msg_dic[filename+'_Filesize']=file_sizeprint('\033[1;32mSend Info to Server:\033[0m \n',msg_dic)self.client.send(json.dumps(msg_dic).encode())server_ack=self.client.recv(8192)print('Server ACK:',server_ack)f=open(filename,'rb')finished_size=0start_time=time.time()clac_start_time=start_timefor line in f:self.client.send(line)finished_size+=len(line)while time.time() - start_time >0.5:self.progressbar(finished_size,file_size)start_time=time.time()   #print percentage every 0.5 secondprint('\033[1;31m%s done,use time:%i seconds\033[0m' %(cmd,time.time()-clac_start_time))f.close()def cmd_get(self,*args):cmd,filename=args[0].split()msg_dic['Action']=cmdmsg_dic['Filename']=filenameself.client.send(json.dumps(msg_dic).encode())file_size=int(self.client.recv(8192).decode())print('\033[1;32mGet File,size:\033[0m',file_size)self.client.send(b'Client ACK')f=open(filename,'wb')finished_size=0while finished_size < file_size:data=self.client.recv(8192)f.write(data)finished_size+=len(data)self.progressbar(finished_size,file_size)else:print('\033[1;32mReceive done\033[0m',os.stat(filename))f.close()def cmd_ls(self,*args):cmd=args[0].split()[0]msg_dic['Action']=cmdself.client.send(json.dumps(msg_dic).encode())file_list=self.client.recv(8192)print('\033[1;32mMy file list in server:\033[0m',file_list.decode())ftp_client=Scok_Client()
ftp_client.connect('localhost',999)
ftp_client.interactive()

server code:

#Author :ywq
import socketserver,sys,os,jsonclient_dic={}
def dic_init(username,password):client_dic[username]={}client_dic[username]['file_list']=[]client_dic[username]['Username']=usernameclient_dic[username]['Password']=passworddic_init('ywq','qwe')
with open('client_auth.json','w')as auth_conf:json.dump(client_dic,auth_conf)'''save the client auth_info as json_format into local'''with open('client_auth.json','r+') as auth_conf:client_dic=json.load(auth_conf)        #load client auth_infodef auth(recv_dic):client_user=recv_dic['Username']client_passwd=recv_dic['Password']if client_user == client_dic[client_user]['Username'] and client_passwd == client_dic[client_user]['Password']:passelse:exit('Auth failed')class MyHandler(socketserver.BaseRequestHandler):def handle(self):while True:try:recv_dic=json.loads(self.request.recv(8192).decode())print('\033[1;31mReceive client dic\033[0m\n',recv_dic)auth(recv_dic)client_cmd=recv_dic['Action']if hasattr(self,'client_%s' %client_cmd ):exec_cmd=getattr(self,'client_%s' %client_cmd)exec_cmd(recv_dic)except Exception as e:print('Error:',e)def client_put(self,*args):recv_dic=args[0]client_user=recv_dic['Username']client_dic[client_user].update(recv_dic)filename=recv_dic['Filename']filesize=int(recv_dic[filename+'_Filesize'])print(filesize)received_size=0if os.path.isfile(filename):print('file is already exist')exit(2)else:f=open(filename,'wb')self.request.send(b'Server ACK')while received_size < filesize:data=self.request.recv(8192)f.write(data)received_size+=len(data)else:print('\033[1;32m Recv done! \033[0m',os.stat(filename))f.close()client_dic[client_user]['file_list'].append(filename)print(client_dic[client_user]['file_list'])with open('client_auth.json','r+') as auth_conf:json.dump(client_dic,auth_conf)def client_get(self,*args):recv_dic=args[0]filename=recv_dic['Filename']file_size=os.stat(filename).st_size  #or os.path.getsize()self.request.send(str(file_size).encode())   #send file size to clientclient_ack=self.request.recv(8192)f=open(filename,'rb')for line in f:self.request.send(line)print('\033[1;32m Send done ,total size:\033[0m',file_size)f.close()def client_ls(self,*args):recv_dic=args[0]client_user=recv_dic['Username']user_file_list=client_dic[client_user]['file_list']self.request.send(str(user_file_list).encode())print('\033[1;32m Send file_list to user %s:\033[0m' %client_user)IP,Port='localhost',999
server=socketserver.ThreadingTCPServer((IP,Port),MyHandler)
print('\033[1;32mWaiting for connection:\033[0m')
server.serve_forever()

运行效果:

运行完成后的json文件:

Python 写一个简单的FTPv2相关推荐

  1. 用python写一个简单的web服务器

    人生苦短,我用python 简洁高效,这才是理想的语言啊 分享一点python的学习经验-----如何用python写一个简单的web服务器 首先,我们需要简单地了解一下网络通信协议,这里用白话介绍一 ...

  2. 利用python写一个简单的双色球彩票系统

    利用python写一个简单的双色球彩票系统 1.设置每次买的号码一样 写一个双色球彩票系统,系统可以随机产生一组数据,一组彩票数据有六位数,这六位数的的取值范围是0和1. 一张彩票是两块钱,用户可以选 ...

  3. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

  4. 用Python写一个简单的双均线策略分析

    用Python写一个简单的双均线策略 双均线策略 先罗列一下我知道的量化策略: 双均线:一句话来讲就是金叉买死叉卖. 布林带:突破压力线(上轨)清仓,跌破支撑线(下轨)持仓. PEG:根据PE/G调整 ...

  5. python解析器是什么_如何用python写一个简单的词法分析器

    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...

  6. python可以做机器人吗_零基础如何用Python写一个简单的WeChat机器人?(内附代码)...

    (bing图片) python这两年热火朝天,依托其众多类库,基于python的应用层出不穷,也大大降低了非计算机专业人员的入门门槛,WeChat机器人自然不在话下!-- 聪明的瓦肯人 苦于有时候总是 ...

  7. python写词法分析器_如何用python写一个简单的词法分析器

    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...

  8. python写词法分析器_用python写一个简单的词法分析器

    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...

  9. 用python写一个简单的推荐系统

    前言 在上篇文章豆瓣电影,电视剧DM实战中提及到,我和室友们产生了剧荒,萌生出要做一个个人用的推荐系统,解决剧荒的问题的想法,经过一轮的死缠烂打,这个个人推荐系统终于成型了. 今天来分享一下心得,对此 ...

  10. python旅游推荐系统_用python写一个简单的推荐系统

    前言 在上篇文章豆瓣电影,电视剧DM实战中提及到,我和室友们产生了剧荒,萌生出要做一个个人用的推荐系统,解决剧荒的问题的想法,经过一轮的死缠烂打,这个个人推荐系统终于成型了. 今天来分享一下心得,对此 ...

最新文章

  1. 【CUDA学习】GPU硬件结构
  2. 什么是方向图乘积定理_课本上没有,但十分好用的初中数学定理公式
  3. php加密手机版_PHP解密支付宝小程序的加密数据、手机号的示例代码
  4. 微软Hololens设备 浅分析
  5. 时间序列:等分布序列(Equidistributed sequence)
  6. 解决不了“不可能三角”,火山抖音化只是个昏招
  7. Npgsql 6.0.2 发布,赶紧升级!!!
  8. CAP带你轻松玩转ASP.NETCore消息队列
  9. Linux下Samba服务器搭建
  10. 计算机软件无形资产机械工具,考前秘籍,无形资产的定义及确认
  11. MaxCompute 中的Code Generation技术简介
  12. AutoCompleteTextView组件的功能和用法
  13. delphi 线程安全list_Java的中的集合(容器)-List
  14. PHP 长连接,奏是这么简单
  15. 哪个工厂不用加班,工资也不低?
  16. Linux之find exec
  17. ShuffleNet 系列(1): ShuffleNet v1 理论讲解
  18. C++ Primer Plus 学习笔记(十一)
  19. httpwatch使用
  20. Mikrotik路由器(routerOS)调试环境搭建

热门文章

  1. 梁宁《产品思维》之5同理心训练:产品要顺应用户潜意识
  2. [转载]关于雷电防御_-刘艳红-_新浪博客
  3. iOS app上架app store流程详解
  4. WIFI系列协议--802.11ax--wifi6--高效率无线标准简称HE--11Gbit
  5. 记录开发内容demo-java支付宝提现
  6. Java--------面向对象
  7. C# winform 右下角弹窗
  8. vue项目运行后自动打开浏览器
  9. 2. Zigbee应用程序框架开发指南 - 应用程序框架结构
  10. 冬至幻灵怎么修改服务器名字,冬至幻灵如何给自己加元宝