登录系统服务器返回值异常引发UnicodeDecodeError问题求助
问题排查与修复
核心错误原因
你收到的二进制字符串是MySQL服务的握手报文,根源是客户端代码错误连接了MySQL的默认端口3306,而非你自己搭建的登录服务器监听的8888端口。这导致客户端直接和MySQL服务建立了连接,而非自定义登录服务器,自然无法收到预期的登录结果。
具体修复步骤
1. 修正客户端连接端口
将客户端login()函数中的连接端口从3306改为8888,匹配服务器的监听端口。
2. 修复客户端数据交互逻辑
当前客户端只是把服务器发送的提示信息原封不动回传,没有实际发送用户输入的用户名和密码,需要修改为读取GUI输入框内容后发送。
3. 统一密码哈希逻辑
确保数据库中存储的密码是SHA256哈希后的字符串,与服务器端的处理逻辑完全一致。
4. 服务器端资源释放
数据库连接和游标使用完毕后必须关闭,避免长期占用资源导致泄漏。
修正后的代码
服务器端代码(补充资源释放)
import hashlib import socket import threading import mysql.connector import theGUI server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(("localhost", 8888)) server.listen() def handle_connection(c): try: # 发送用户名提示,接收用户输入的用户名 c.send("请输入用户名:".encode()) username = c.recv(1024).decode().strip() # 发送密码提示,接收用户输入的密码 c.send("请输入密码:".encode()) password = c.recv(1024).strip() # 哈希密码 hashed_password = hashlib.sha256(password).hexdigest() # 连接数据库并验证 conn = mysql.connector.connect( host="localhost", user="root", passwd='password', database="users", auth_plugin='mysql_native_password' ) cur = conn.cursor() cur.execute("SELECT * FROM userdata WHERE username = %s AND password = %s", (username, hashed_password)) user = cur.fetchone() if user: c.send("Login Successful!".encode()) else: c.send("Login failed!".encode()) finally: # 释放数据库资源 if 'cur' in locals(): cur.close() if 'conn' in locals(): conn.close() # 关闭客户端连接 c.close() while True: client, addr = server.accept() threading.Thread(target=handle_connection, args=(client,)).start()
客户端登录函数代码(修正连接与逻辑)
import socket def login(): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接自己的登录服务器端口8888 client.connect(("localhost", 8888)) try: # 接收用户名提示,发送输入的用户名 client.recv(1024) username = username_entry.get().strip() # 假设username_entry是GUI的用户名输入框 client.send(username.encode()) # 接收密码提示,发送输入的密码 client.recv(1024) password = password_entry.get().strip() # 假设password_entry是GUI的密码输入框 client.send(password.encode()) # 接收登录结果并显示 result = client.recv(1024).decode() result_label.configure(text=result) finally: client.close()
额外说明
- 确保GUI模块中的输入框变量(如
username_entry、password_entry)与客户端代码中的调用一致。 - 数据库中
userdata表的password字段需存储SHA256哈希后的字符串,长度建议设为64位(SHA256哈希结果的固定长度)。
内容的提问来源于stack exchange,提问作者Salty_Toad
相关产品推荐
相关产品推荐

