python——网盘系统

sever端

#Author:YuSong
import os
import sys
import json
import hashlib
import struct
import socketserver


class Mysever(socketserver.BaseRequestHandler):

    path1 = r'C:\Users\86178\Desktop\考研辅导'


    @staticmethod
    def sha(username):          #加密
        key = hashlib.sha1('淞哥专用'.encode('utf-8'))
        key.update(username.encode('utf-8'))
        return key.hexdigest()


    @classmethod
    def show_file(cls, path1):  # 显示文件夹中的文件
        l = []
        if os.path.isdir(path1):
            name_list = os.listdir(path1)
            for i in name_list:
                abs_path = os.path.join(path1, i)
                if os.path.isfile(abs_path):
                    l.append(abs_path)
                elif os.path.isdir(abs_path):
                    cls.show_file(abs_path)
        else:
            l.append(path1)
        return l


    @staticmethod
    def send(conn, info):  # 发送
        info_len = struct.pack('i', len(info.encode('utf-8')))
        conn.send(info_len)
        conn.send(info.encode('utf-8'))


    @staticmethod
    def recv(conn):       # 接收
        msg_len = conn.recv(4)
        length = struct.unpack('i', msg_len)
        msg = conn.recv(length[0]).decode('utf-8')
        return msg


    @classmethod
    def download(cls,conn):      # 下载
        ret = cls.show_file(cls.path1)
        ret = json.dumps(ret)
        cls.send(conn, ret)
        msg_len = conn.recv(4)
        length = struct.unpack('i', msg_len)
        msg = conn.recv(length[0]).decode('utf-8')
        msg = json.loads(msg)
        with open(msg['filename'], mode='rb') as f:
            while msg['filesize'] > 0:
                content = f.read(1024)
                msg['filesize'] -= 1024
                conn.send(content)


    @staticmethod
    def upload(conn):      # 上传
        msg_len = conn.recv(4)
        length = struct.unpack('i', msg_len)
        msg = conn.recv(length[0]).decode('utf-8')
        msg = json.loads(msg)
        with open(os.path.basename(msg['filename']), mode='wb') as f1:
            while msg['filesize'] > 0:
                content = conn.recv(1024)
                msg['filesize'] -= len(content)
                f1.write(content)


    def handle(self):      #主程序
        conn=self.request
        while 1:
            flag1=True
            while flag1:
                    info='欢迎登录系统'
                    Mysever.send(conn,info)
                    msg=Mysever.recv(conn)
                    ret = Mysever.sha(msg)
                    with open('login', encoding='utf-8', mode='r') as f:
                        for line in f:
                            if ret == line.strip():
                                ret,flag1=True,False
                                break
                        else:
                            flag1,ret=False,False
                        flag = {'operate': 'login', 'state': ret}
                        flag = json.dumps(flag)
                        Mysever.send(conn,flag)
                    flag4=True      #退出标志
                    while flag4:
                        msg1=Mysever.recv(conn)
                        if hasattr(self, msg1):
                            getattr(self, msg1)(conn)
                        else:
                            flag4=False
                            conn.close()


sever=socketserver.ThreadingTCPServer(('127.0.0.1',9001),Mysever)
sever.serve_forever()

client端

#Author:YuSong
import os
import sys
import json
import hashlib
import socket
import struct

sk=socket.socket()
sk.connect(('127.0.0.1',9001))


def MD5(username,password):   #加密
    md5=hashlib.md5(username.encode('utf-8'))
    md5.update(password.encode('utf-8'))
    return md5.hexdigest()


def standard(path):  #常规操作
    filename=os.path.basename(path)
    filesize = os.path.getsize(path)
    dic1 = {'filename': path, 'filesize': filesize}
    str_dic1 = json.dumps(dic1).encode('utf-8')
    dic1_len = struct.pack('i', len(str_dic1))
    sk.send(dic1_len)
    sk.send(str_dic1)
    return filename,dic1


def download(sk,path1):    #下载
    filename,dic1=standard(path1)
    with open(filename,mode='wb') as f1:
        while dic1['filesize']>0:
            content=sk.recv(1024)
            dic1['filesize']-=len(content)
            f1.write(content)


def upload(sk,path1): #上传
    ret = show_file(path1)
    for index, a in enumerate(ret, 1):
        print(index, os.path.basename(a))
    num1 = int(input('>>>>>'))
    path=ret[num1 - 1]
    filename,dic1 =standard(path)
    with open(path,mode='rb') as f:
        while dic1['filesize']>0:
            content=f.read(1024)
            dic1['filesize']-=1024
            sk.send(content)


def show_file(path1):  #显示文件夹
    l = []
    if os.path.isdir(path1):
        name_list=os.listdir(path1)
        for i in name_list:
            abs_path=os.path.join(path1,i)
            if os.path.isfile(abs_path):
                l.append(abs_path)
            elif os.path.isdir(abs_path):
                show_file(abs_path)
    else:
        l.append(path1)
    return l


def send(sk,ret):  #发送
    ret=ret.encode('utf-8')
    ret_len = struct.pack('i', len(ret))
    sk.send(ret_len)
    sk.send(ret)


def recv(sk):     #接收
    msg_len = sk.recv(4)
    length = struct.unpack('i', msg_len)
    msg = sk.recv(length[0]).decode('utf-8')
    return msg

def func():
    flag3=True
    while flag3:
        msg=recv(sk)
        if msg=='欢迎登录系统':
            print('\033[33m %s \033[0m'%msg)
            usr=input('请输入您的用户名:')
            psd=input('请输入您的密码:')
            ret=MD5(usr,psd)
            send(sk,ret)
        else:
            msg=json.loads(msg)
            while msg['state']:
                opt_lst=[('上传','upload'),('下载','download')]
                for index,(a,b) in enumerate(opt_lst,1):
                    print(index,a)
                num=input('>>>>>')
                if num.isdecimal():
                    num=int(num)
                    if 0<num<=len(opt_lst):
                        if hasattr(sys.modules[__name__],opt_lst[num-1][1]):
                            send(sk, opt_lst[num - 1][1])
                            if opt_lst[num-1][1]=='upload':
                                path1=input('请输入你想要上传的文件的地址:')
                            else:
                                lst=recv(sk)
                                lst=json.loads(lst)
                                for index,a in enumerate(lst, 1):
                                    print(index, os.path.basename(a))
                                num1= int(input('>>>>>'))
                                path1= lst[num1 - 1]
                            getattr(sys.modules[__name__],opt_lst[num - 1][1])(sk,path1)
                    else:
                        print('请输入一个范围内的数!!!')
                elif num.upper()=='Q':   #退出键
                    msg['state']=False
                    send(sk,'False')
                    flag3=False
                    sk.close()
                else:
                    print('请输入数字')

# path1=r'C:\Users\86178\Desktop'----->测试用
if __name__ == '__main__':
    func()
posted @ 2020-04-24 18:00  YuSong_HIT  阅读(605)  评论(0)    收藏  举报