#-*- coding:utf-8 -*-
import socketserver
from module import *
class server:
def __init__(self,request):
self.conn=request
self.conn.sendall(by('欢迎光临大龙FTP!'))
def login(self):
self.user=st(self.conn.recv(1024))
self.conn.sendall(by(''))
self.password=st(self.conn.recv(1024))
if self.user in userdict.keys() and self.password==userdict[self.user]:
self.result='Success'
self.conn.sendall(by('\033[32m登陆成功!\033[0m'))
else:
self.result='Failed'
self.conn.sendall(by('\033[31m登陆失败!\033[0m'))
log(self.user,self.result,'users_log.txt')
return self.result
def register(self):
self.user=st(self.conn.recv(1024))
self.conn.sendall(by(''))
self.password=st(self.conn.recv(1024))
if self.user in userdict.keys():
self.conn.sendall(by('\033[031m注册失败,该用户已存在\033[0m'))
else:
self.conn.sendall(by('\033[032m注册成功!\033[0m'))
userdict[self.user]=self.password
self.userdump()
log(self.user,self.result,'users_log.txt')
def put(self):
self.use=0
self.name=st(self.conn.recv(1024))
self.conn.sendall(by(''))
self.size=int(st(self.conn.recv(1024)))
if os.path.isfile('ftp\\'+self.name):
print('cun zai')
print('ftp\\'+self.name)
self.have=os.path.getsize('ftp\\'+self.name)
self.conn.sendall(by(str(self.have)))
self.choose=st(self.conn.recv(1024))
if self.choose=='':
self.have=0
self.conn.sendall(by(''))
# self.size=int(st(self.conn.recv(1024)))
self.conn.sendall(by(''))
f=open('ftp\\'+self.name,'ab')
while self.size != self.use:
self.line=self.conn.recv(1024)
f.write(self.line)
self.use+=len(self.line)
f.close()
print('wanbi')
log(self.user,'Success','file_log.txt')
if self.choose=='':
self.conn.sendall(by(''))
# self.size=int(st(self.conn.recv(1024)))
self.conn.sendall(by(''))
f=open('ftp\\'+self.name,'ab')
while self.size != self.use:
self.line=self.conn.recv(1024)
f.write(self.line)
self.use+=len(self.line)
f.close()
print('wanbi')
log(self.user,'Success','file_log.txt')
else:
print('no zai')
self.conn.sendall(by(str(0)))
# self.size=int(st(self.conn.recv(1024)))
self.conn.sendall(by(''))
f=open('ftp\\'+self.name,'wb')
while self.size > self.use:
self.line=self.conn.recv(1024)
f.write(self.line)
self.use+=len(self.line)
f.close()
print('wanbi')
log(self.user,'Success','file_log.txt')
def get(self):
self.cmd()
self.path=st(self.conn.recv(1024))
if self.path not in os.listdir('ftp'):
self.conn.sendall(by(''))
else:
self.conn.sendall(by(''))
self.size=os.path.getsize(self.path)
self.conn.sendall(by(str(self.size)))
self.conn.recv(1024)
with open('ftp\\%s'%self.path,'rb') as f :
for line in f:
self.conn.sendall(line)
log(self.user,'Success','file_log.txt')
def cmd(self):
cmd=st(self.conn.recv(1024))
p = os.popen(cmd)
x = p.read()
self.conn.sendall(by(x))
@staticmethod
def userdump():
with open('user.txt','wb') as f:
pickle.dump(userdict,f)
f.close()
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
s=server(self.request)
while True:
opt=st(s.conn.recv(1024))
print(userdict)
if opt =='':
self.result=s.login()
if 'Failed' in self.result:continue
while True:
opt2 = st(s.conn.recv(1024))
if opt2 =='':
print('put')
s.put()
elif opt2=='':
s.cmd()
elif opt2=='':
print('get')
s.get()
elif opt2=='':
break
elif opt=='':
s.register()
elif opt=='':
break if __name__=='__main__':
Server=socketserver.ThreadingTCPServer(('127.0.0.1',8888),Myserver)
Server.serve_forever()
# print(dir(socketserver))

server端程序

#-*- coding:utf-8 -*-
from module import *
import os
import socket
import pickle
import os
import sys
try:
userdict = pickle.load(open('user.txt', 'rb'))
except Exception as e:
userdict = {}
def log(user,result,file):
with open(file,'a') as f:
attime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
f.write('%s %s %s\n'%(attime,result,user)) class client:
def __init__(self,address,port):
self.obj=socket.socket()
self.obj.connect((address,port))
print(st(self.obj.recv(1024)))
def login(self,user,password):
self.obj.sendall(by(user))
self.obj.recv(1024)
self.obj.sendall(by(password))
self.result=st(self.obj.recv(1024))
print(self.result)
def register(self,user,password):
self.obj.sendall(by(user))
self.obj.recv(1024)
self.obj.sendall(by(password))
self.result=st(self.obj.recv(1024))
print(self.result)
def put(self,path):
self.size=os.path.getsize(path)
name=path.split('\\')[-1]
self.obj.sendall(by(name))
self.obj.recv(10241)
self.obj.sendall(by(str(self.size)))
have=int(st(self.obj.recv(1024)))
if have>=self.size:
print('\033[031m该文件已存在\033[0m!')
self.obj.sendall(by(str(0)))
elif 0<have<self.size:
choose=input('1、断点续传 2、重新传\n请选择:').strip()
self.obj.sendall(by(choose))
if choose=='':have=0
self.obj.sendall(by(str(self.size)))
st(self.obj.recv(1024))
with open(path,'rb') as f :
f.seek(have)
for line in f:
self.obj.sendall(line)
have+=len(line)
schedule(self.size,have)
f.close()
print('\033[032m上传成功!\033[0m')
else:
self.obj.sendall(by(str(self.size)))
st(self.obj.recv(1024))
with open(path,'rb') as f :
f.seek(have)
for line in f:
self.obj.sendall(line)
have+=len(line)
schedule(self.size,have)
f.close()
print('\033[032m上传成功!\033[0m')
def get(self,path):
# self.obj.sendall(by(path))
# self.have=st(self.obj.recv(1024))
# if self.have=='0':
self.size=int(st(self.obj.recv(1024)))
self.obj.sendall(by(''))
self.use=0
if os.path.isfile('get\\'+path):
self.cover=input('\033[031m该文件已存在,是否覆盖?\n\t1、是\t\t2、否\n\033[0m请选择:').strip()
if self.cover=='':
f=open('get\\'+path,'wb')
while self.size != self.use:
self.line=self.obj.recv(1024)
f.write(self.line)
self.use+=len(self.line)
schedule(self.size,self.use)
f.close()
print('\033[032m下载成功\033[0m')
elif self.cover=='':pass
else:print('\033[31m输入无效\033[0m')
else:
f=open('get\\'+path,'wb')
while self.size> self.use:
self.line=self.obj.recv(1024)
f.write(self.line)
self.use+=len(self.line)
schedule(self.size,self.use)
f.close()
print('\033[032m下载成功\033[0m')
# self.obj.recv()
def cmd(self,cmd):
self.obj.sendall(by(cmd))
self.result=st(self.obj.recv(4096))
print('\033[32m%s\033[0m'%self.result)
c=client('127.0.0.1',8888)
while True:
opt=input('请选择: 1、登陆 2、注册 3、退出\n>>>')
c.obj.sendall(by(opt))
if opt=='':
user = input('请输入用户名:')
password = input('请输入密码:')
c.login(user,password)
if '失败' in c.result:continue
while True:
opt2 = input('请选择: 1、上传 2、下载 3、执行命令 4、退出\n>>>')
if opt2=='':
path=input('请输入要上传的文件路径:')
if not os.path.isfile(path):
print('\033[031m输入路径无效!\033[0m')
continue
else:
c.obj.sendall(by(opt2))
c.put(path)
elif opt2=='':
c.obj.sendall(by(opt2))
c.cmd('dir ftp | findstr /v 目录 |findstr /v 驱动器 |findstr /v 序列号|findstr /v DIR')
path=input('请输入要下载的文件名:').strip()
c.obj.sendall(by(path))
have=st(c.obj.recv(1024))
if have=='':
print('\033[031m输入路径无效!\033[0m')
continue
else:c.get(path)
elif opt2=='':
c.obj.sendall(by(opt2))
cmd=input('请输入要执行的命令:')
c.cmd(cmd)
elif opt2=='':break
else:
print('\033[31m输入无效\033[0m ')
continue
elif opt=='':
user = input('请输入用户名:')
password = input('请输入密码:')
c.register(user,password)
elif opt == '':
break
else:
print('\033[31m输入无效\033[0m')
continue

客户端程序

#-*- coding:utf-8 -*-
import socket
import pickle
import os
import sys
import time
try:
userdict = pickle.load(open('user.txt', 'rb'))
except Exception as e:
print(e)
userdict = {}
def log(user,result,file):
with open(file,'a') as f:
attime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
f.write('%s %s %s\n'%(attime,result,user))
def by(word):
a=bytes(word,encoding = 'utf-8')
return a
def st(word):
b=str(word,encoding = 'utf-8')
return b
def schedule(size,use):
sys.stdout.write("\r")
sys.stdout.write("%s%% | %s" % (int(use / size * 100), int(use / size * 100) * '#'))
sys.stdout.flush()

模板程序

最新文章

  1. .Net程序在linux mono环境和WindowsServer上执行测试对比
  2. mysql中字符集的比较
  3. 详解在Visual Studio中使用git版本系统[转]
  4. GitHub 上有哪些完整的 iOS-App 源码值得参考
  5. nodejs 安装及部署遇到的问题
  6. oracle、mysql、sybase和sqlserver复制表结构和数据
  7. Django session 详解-part II-session
  8. PHPCMS数据筛选功能实现
  9. jQuery name checked 模糊查找匹配ID
  10. Nexus 刷机
  11. 解决pycharm无法导入本地包的问题(Unresolved reference &#39;tutorial&#39;)
  12. c++动态库与静态库
  13. win7下建立超级隐藏账户
  14. gulp学习笔记——最好的学习文档是官网
  15. 【Oracle 11gR2】静默安装 db_install.rsp文件详解
  16. CSS----学习2
  17. Qt Creator无法debug,报错:The selected debugger may be inappropriate for the inferior. Examining symbols and setting breakpoints by file name and line number may fail. The inferior is in the Portable ...
  18. linux内核内存分配(三、虚拟内存管理)
  19. Win一键查看用户密码
  20. 【CI】CN.一种多尺度协同变异的微粒群优化算法

热门文章

  1. Collection Of SVM Libraries By Language via datasciencecentral
  2. 那些跟钱有关的事儿 z
  3. ASDL + WN725N 配置无线AP
  4. Doing Homework(HDU 1074状压dp)
  5. CentOS 6.4利用xampp安装bugfree3
  6. sql-表值函数tvf
  7. leetcode@ [241] Different Ways to Add Parentheses (Divide and Conquer)
  8. 可以使用Markdown了?
  9. 初识cocos2d-x-从环境配置到整体框架
  10. 【转】 hive简介,安装 配置常见问题和例子