使用socket实现FTP程序

#-*- 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()

模板程序

上一篇:分布式服务:Dubbo+Zookeeper+Proxy+Restful 分布式架构


下一篇:python引用,浅复制,深复制