Python3.9 TCP聊天室新增管理员功能后报WinError 10053连接中断错误
故障原因及修复方案
核心错误点
服务端致命错误(直接导致崩溃)
- 封禁逻辑的对象调用错误
在服务端receive函数的封禁判断块中,你错误调用了客户端列表clients的send方法:
# 错误写法 clients.send('BAN'.encode('ascii'))
clients是存储所有已连接客户端对象的列表,本身不存在send方法,调用后会直接触发服务端异常崩溃。
- 管理员身份判断逻辑错误
在handle函数中校验操作人是否为管理员时,你错误调用了客户端对象本身的index方法:
# 错误写法 if nicknames[client.index(client)] == 'admin':
client是单个socket连接对象,没有index方法,正确逻辑是从clients列表中获取当前对象的索引:
# 正确写法 if nicknames[clients.index(client)] == 'admin':
- 潜在文件不存在报错
首次运行时如果本地没有bans.txt文件,服务端读取文件时会触发FileNotFoundError直接崩溃。
客户端错误(触发连接断开抛出10053)
- socket方法拼写错误
客户端receive函数存在2个方法名拼写错误,直接导致客户端收到指令后异常断开连接:
- 错误写法:
next_message = client.serv(1024).decode('ascii'),不存在serv方法,正确为recv - 错误写法:
if client.rect(1024).decode('ascii') == 'REFUSE':,不存在rect方法,正确为recv
- 指令判断顺序错误
客户端发完昵称后的指令判断顺序和服务端发送顺序不匹配,会导致封禁、密码校验逻辑错乱。
修复代码片段
服务端修复
- 修正封禁逻辑调用对象:
if nickname+'\n' in bans: client.send('BAN'.encode('ascii')) client.close() continue
- 新增bans.txt存在性校验,在读取bans.txt前加:
import os if not os.path.exists('bans.txt'): open('bans.txt', 'w').close()
- 修正管理员身份判断逻辑:
if nicknames[clients.index(client)] == 'admin':
客户端修复
- 修正socket方法拼写,调整逻辑顺序:
if message == 'NICK': client.send(nickname.encode('ascii')) next_message = client.recv(1024).decode('ascii') if next_message == 'BAN': print('Connessione negata, sei bannato!') client.close() stop_thread = True elif next_message == 'PASS': client.send(password.encode('ascii')) check_msg = client.recv(1024).decode('ascii') if check_msg == 'REFUSE': print("Password sbagliata!") stop_thread = True
修复完成后即可正常运行。
内容的提问来源于stack exchange,提问作者El3ctro4ndre
相关产品推荐
相关产品推荐

