zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/raygor/p/13867179.html
Copyright © 2011-2022 走看看