#-*- 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('1'))
        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('1'))
        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('1'))
        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=='2':
                self.have=0
                self.conn.sendall(by('1'))
                # self.size=int(st(self.conn.recv(1024)))
                self.conn.sendall(by('11'))
                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=='1':
                self.conn.sendall(by('1'))
                # self.size=int(st(self.conn.recv(1024)))
                self.conn.sendall(by('11'))
                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('11'))
            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('0'))
        else:
            self.conn.sendall(by('1'))
            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 =='1':
                self.result=s.login()
                if 'Failed' in self.result:continue
                while True:
                    opt2 = st(s.conn.recv(1024))
                    if  opt2 =='1':
                        print('put')
                        s.put()
                    elif opt2=='3':
                        s.cmd()
                    elif opt2=='2':
                        print('get')
                        s.get()
                    elif opt2=='4':
                        break
            elif opt=='2':
                s.register()
            elif opt=='3':
                break

if __name__=='__main__':
    Server=socketserver.ThreadingTCPServer(('127.0.0.1',8888),Myserver)
    Server.serve_forever()
# print(dir(socketserver))
server端程序

相关文章: