基于TCP/IP实现简单的 登录校验

Posted on 2019-11-12 20:45  Max404  阅读(257)  评论(0编辑  收藏  举报

下文所用文档内容
"userinfo.txt"
    zhangsan:e7a6d0f97db7ea1c4a0c1c137cbf771c     
		lisi:c79439cf9abcbd6c6d46e45766a9e64a
wangwu:f77599e7005939d280742dc8eb5db89a
zhaoliu:00ce36c50bbc8c067a5a7a628ca14688

  

Server

# ### 服务端
import hashlib
import socket
import json

def get_md5_code(usr,pwd):
    # 将用户名作为加密的盐key
    hm = hashlib.md5(usr.encode())
    hm.update(pwd.encode())
    res = hm.hexdigest()
    return res
    
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sk.bind( ("127.0.0.1",9000) )
sk.listen()
conn,addr = sk.accept()

# 处理收发数据的逻辑
# 先接受二进制字节流 -> 字符串
msg = conn.recv(1024).decode()
print(msg,type(msg))
# 把字符串 -> 字典
dic = json.loads(msg)
print(dic,type(dic))

# 标识符,默认False
sign = False
with open("userinfo.txt",mode="r",encoding="utf-8") as fp:
    for line in fp:
        usr,pwd = line.strip().split(":")
        if usr == dic["username"] and pwd == get_md5_code(dic["username"],dic["password"]):
            # 登陆成功 返回状态吗为1
            res = {"code":1}
            res_msg = json.dumps(res).encode()
            conn.send(res_msg)
            # 如果登录成功,默认改成True
            sign = True
            break
            
if sign == False:
    #登录失败,返回状态码为0
    res = {"code":0}
    conn.send(json.dumps(res).encode())
            
            

# 四次挥手
conn.close()
# 退还端口
sk.close()

"""
# 复习:文件对象是迭代器
fp = open("userinfo.txt",mode="r",encoding="utf-8")
from collections import Iterator,Iterable
print( isinstance(fp,Iterator) )
"""

 

Client

# ### 客户端
import socket,json
client = socket.socket()
client.connect( ("127.0.0.1",9000) )

usr = input("请输入您的账户:")
pwd = input("请输入您的密码:")
dic = {"username":usr,"password":pwd,"status":"login"}
# 返回json格式的字符串
res = json.dumps(dic)
# 在把json字符串转换成字节流
bytes_msg = res.encode()
# 发送给服务端
client.send(bytes_msg)

# 接受服务端发送回来的数据
res_msg = client.recv(1024).decode()
# 把字符串变成字典
dic_code = json.loads(res_msg)

if dic_code["code"]:
    print("恭喜你,登陆成功")
else:
    print("抱歉,登陆失败")

# 关闭链接
client.close()