zoukankan      html  css  js  c++  java
  • 使用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('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('33[32m登陆成功!33[0m'))
            else:
                self.result='Failed'
                self.conn.sendall(by('33[31m登陆失败!33[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('33[031m注册失败,该用户已存在33[0m'))
            else:
                self.conn.sendall(by('33[032m注册成功!33[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端程序
    #-*- 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
    '%(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('33[031m该文件已存在33[0m!')
                self.obj.sendall(by(str(0)))
            elif 0<have<self.size:
                choose=input('1、断点续传    2、重新传
    请选择:').strip()
                self.obj.sendall(by(choose))
                if choose=='2':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('33[032m上传成功!33[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('33[032m上传成功!33[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('1'))
            self.use=0
            if os.path.isfile('get\'+path):
                self.cover=input('33[031m该文件已存在,是否覆盖?
    	1、是		2、否
    33[0m请选择:').strip()
                if self.cover=='1':
                    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('33[032m下载成功33[0m')
                elif self.cover=='2':pass
                else:print('33[31m输入无效33[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('33[032m下载成功33[0m')
            # self.obj.recv()
        def cmd(self,cmd):
            self.obj.sendall(by(cmd))
            self.result=st(self.obj.recv(4096))
            print('33[32m%s33[0m'%self.result)
    c=client('127.0.0.1',8888)
    while True:
        opt=input('请选择: 1、登陆     2、注册     3、退出
    >>>')
        c.obj.sendall(by(opt))
        if opt=='1':
            user = input('请输入用户名:')
            password = input('请输入密码:')
            c.login(user,password)
            if '失败' in c.result:continue
            while True:
                opt2 = input('请选择: 1、上传     2、下载        3、执行命令     4、退出
    >>>')
                if opt2=='1':
                    path=input('请输入要上传的文件路径:')
                    if not os.path.isfile(path):
                        print('33[031m输入路径无效!33[0m')
                        continue
                    else:
                        c.obj.sendall(by(opt2))
                        c.put(path)
                elif opt2=='2':
                    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=='0':
                        print('33[031m输入路径无效!33[0m')
                        continue
                    else:c.get(path)
                elif opt2=='3':
                    c.obj.sendall(by(opt2))
                    cmd=input('请输入要执行的命令:')
                    c.cmd(cmd)
                elif opt2=='4':break
                else:
                    print('33[31m输入无效33[0m  ')
                    continue
        elif opt=='2':
            user = input('请输入用户名:')
            password = input('请输入密码:')
            c.register(user,password)
        elif opt == '3':
            break
        else:
            print('33[31m输入无效33[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
    '%(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("
    ")
        sys.stdout.write("%s%% | %s" % (int(use / size * 100), int(use / size * 100) * '#'))
        sys.stdout.flush()
    模板程序
  • 相关阅读:
    idea的tomcat消失
    数据表南车
    ElementU日历Demo
    ElementUI表格行编辑单元格编辑支持(输入框,选择框)Demo
    expect ':' at 0, actual = (JSON转化异常解决)
    java获取日历格式的日期数据
    java判断某个日期在两个日期之间(区间) (包含或不包含两个日期)
    localDate和Date的转化
    ImmutableMap的put方法问题
    invalid comparison: java.time.LocalDate and java.lang.String
  • 原文地址:https://www.cnblogs.com/shenwenlong/p/5607608.html
Copyright © 2011-2022 走看看