client / server端用户的登录

# 客户端
import socket
import hashlib
import json
import os
import struct

sk = socket.socket()  # 实例化
sk.connect(('127.0.0.1', 8090)) # 请求连接


def login():

    dic = {'status': False, 'username': None, 'password': None}
    c = 3
    while c: # 只循环3次
        username = input('请输入用户名:')
        password = input('请输入密码:')

        md5_obj = hashlib.md5(password.encode('utf-8')) # 加密
        md5_obj.update(username.encode('utf-8')) # 加盐
        pwd = md5_obj.hexdigest() # 生成最终的密文

        dic['username'] = username
        dic['password'] = pwd
        str_dic = json.dumps(dic) # 序列化
        sk.send(str_dic.encode('utf-8')) 

        res_dic = sk.recv(1024).decode('utf-8')
        result = json.loads(res_dic) # 反序列化

        if result['status']: # 判断目前用户的状态
            print('登陆成功')
            break
        else:
            print('失败,%s' % result['reason'])
            c -= 1
def main():
    login()
main()
# 服务器端
import socketserver
import json
import hashlib
import socket
import struct
import os


class MySocket(socketserver.BaseRequestHandler): # socketserver.BaseRequestHandler  永久开启服务器需要的基类
    def handle(self): # handle是一个固定写法
        sor = ''.encode('utf-8') # 加密需要的盐
        while 1:
            str_dic = self.request.recv(1024).decode('utf-8')
            if not str_dic:break # 用来退出循环,当str_dic为空时退出
            print(str_dic)
            dic = json.loads(str_dic) # 反序列化

            if not dic['status']:
                '''没有登录'''
                with open('info','r',encoding='utf-8') as f:
                    for info in f:
                        username, password = info.strip().split('|')
                        if dic['username'] == username: # 
                            '''用户名存在'''
                            md5_obj = hashlib.md5(dic['password'].encode('utf-8'))
                            md5_obj.update(sor)
                            pwd_m = md5_obj.hexdigest()
                            if password == pwd_m:
                                '''密码正确'''
                                dic['status'] = True
                            else:
                                '''密码错误'''
                                dic['reason'] = '密码错误'
                            break
                    else:
                        '''用户名不存在'''
                        dic['reason'] = '用户名不存在'
                res_dic = json.dumps(dic)
                self.request.send(res_dic.encode('utf-8'))
            else:
                '''登录成功'''
                break

        b_len_dic = self.request.recv(4)
        len_dic = struct.unpack('i', b_len_dic)[0]  # 解决粘包的方法
        str_dic = self.request.recv(len_dic).decode('utf-8')
        dic = json.loads(str_dic)

        if dic['opt'] == 'upload':  # 上传
            filename = '1' + dic['filename']
            with open(filename, 'ab') as f:

                while dic['filesize']:
                    content = self.request.recv(1024)
                    f.write(content)

                    dic['filesize'] -= len(content)


        elif dic['opt'] == 'download':  # 下载
            file_path = self.request.recv(1024).decode('utf-8')
            filename = os.path.basename(file_path)
            filesize = os.path.getsize(file_path)
            dic['filename'] = filename
            dic['filesize'] = filesize
            str_dic1 = json.dumps(dic)
            len_dic1 = len(str_dic1)
            b_len_dic1 = struct.pack('i', len_dic1)
            self.request.send(b_len_dic1 + str_dic1.encode('utf-8'))
            with open(filename, 'rb') as f:
                while dic['filesize']:
                    content = f.read(1024)
                    self.request.send(content)
                    dic['filesize'] -= len(content)

 

posted on 2018-08-19 22:56  窮山霧繞(静妙)  阅读(260)  评论(0编辑  收藏  举报

导航