• 42 练习:利用PyMySQL和socket编写登陆程序


    # client.py 客户端
    import socket
    import struct
    import pickle
    
    def my_send(conn, content):
        b_content = pickle.dumps(content)
        b_length = struct.pack('i', len(b_content))
        conn.send(b_length)
        conn.send(b_content)
    
    def my_recv(conn):
        b_length = conn.recv(4)
        length = struct.unpack('i', b_length)[0]
        b_content = conn.recv(length)
        content = pickle.loads(b_content)
        return content
    
    sk = socket.socket()
    sk.connect(('127.0.0.1', 9000))
    
    print('1.register')
    print('2.login')
    print('3.exit')
    mode = input('pls select ur mode>>>')
    my_send(sk, mode)
    if mode == '1':
        username = input('username:')
        password = input('password:')
        user_dic = {'username': username, 'password': password}
        my_send(sk, user_dic)
        if my_recv(sk): print('register success.')
        else: print('register fail.')
    elif mode == '2':
        username = input('username:')
        password = input('password:')
        user_dic = {'username': username, 'password': password}
        my_send(sk, user_dic)
        if my_recv(sk):
            print('login success.')
        else:
            print('login fail.')
    else: pass
    
    sk.close()
    
    
    # server.py
    import socketserver
    import struct
    import pickle
    import pymysql
    import hashlib
    
    KEY = 'This is the key of hashlib.'
    global Current_user
    
    def my_send(conn, content):
        b_content = pickle.dumps(content)
        b_length = struct.pack('i', len(b_content))
        conn.send(b_length)
        conn.send(b_content)
    
    def my_recv(conn):
        b_length = conn.recv(4)
        length = struct.unpack('i', b_length)[0]
        b_content = conn.recv(length)
        content = pickle.loads(b_content)
        return content
    
    def login(username, password):
        sql_conn = pymysql.connect(host='127.0.0.1', user='root', password='123', database='user_info')
        cur = sql_conn.cursor()
        md = hashlib.md5(KEY.encode('utf-8'))
        md.update(password.encode('utf-8'))
        md5_pwd = md.hexdigest()
        sql = 'select * from user where username=%s and password=%s'
        cur.execute(sql, (username, md5_pwd))
        if cur.rowcount:
            flag = True
        else: flag = False
        cur.close()
        sql_conn.close()
        return flag
    
    def register(username, password):
        sql_conn = pymysql.connect(host='127.0.0.1', user='root', password='123', database='user_info')
        cur = sql_conn.cursor()
        md = hashlib.md5(KEY.encode('utf-8'))
        md.update(password.encode('utf-8'))
        md5_pwd = md.hexdigest()
        try:
            cur.execute(f'select * from user where username = {username}')
        except Exception: pass
        if cur.rowcount:
            cur.close()
            sql_conn.close()
            return False
        sql = 'insert into user values(%s, %s)'
        try:
            cur.execute(sql, (username, md5_pwd))
            sql_conn.commit()
        except Exception as e: print(e)
        cur.close()
        sql_conn.close()
        return True
    
    class Myserver(socketserver.BaseRequestHandler):
        def handle(self):
            conn = self.request  # self.request 就是 conn
            mode = my_recv(conn)
            if mode == '1':
                user_dic = my_recv(conn)
                ret = register(user_dic['username'], user_dic['password'])
                my_send(conn, ret)
            elif mode == '2':
                user_dic = my_recv(conn)
                ret = login(user_dic['username'], user_dic['password'])
                if ret:
                    global Current_user
                    Current_user = user_dic['username']
                my_send(conn, ret)
            conn.close()
    
    
    
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 9000), Myserver)
    server.serve_forever()
    
  • 相关阅读:
    你不得不知道的Visual Studio 2012(2) 全新调试功能
    我看TechEd 2012之App时代降临
    Asp.Net MVC4入门指南(1): 入门介绍
    前端代码标准最佳实践:CSS篇
    Asp.Net MVC4入门指南(2):添加一个控制器
    你不得不知道的Visual Studio 2012(1) 每日必用功能
    Asp.Net MVC4入门指南(4):添加一个模型
    光棍节程序员闯关秀过关全攻略(附带小工具)
    C#性能优化实践
    Asp.Net MVC4入门指南(3):添加一个视图
  • 原文地址:https://www.cnblogs.com/raygor/p/13867179.html
Copyright © 2020-2023  润新知