You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录系统服务器返回值异常引发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:28:36