zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    TI DM3730 EBOOT分析(一)
    收费系统三层+抽象工厂+反射实例
    sql语句中的时间查询
    五线谱学习软件
    hdu1061Rightmost Digit(附20循环的规律解法和附快速幂简单原理)
    云计算安全指南
    linux 下orcale基本操作指令
    HDU/HDOJ 2102 A计划 广度优先搜索BFS
    网站优化策略之SEO必知的七大技巧
    SEO之四大要不得
  • 原文地址:https://www.cnblogs.com/wjs521/p/9503127.html
Copyright © 2011-2022 走看看