Python TCP聊天客户端连接错误求助(NeuralNine教程)
问题排查与修复
服务器端代码错误
- 语法拼接错误(第45行):代码笔误导致
clients.append(clienprint(...))逻辑混乱,需拆分客户端添加与昵称打印操作。 - 线程类名错误(第51行):
threading.thread应为threading.Thread(首字母大写),否则会触发属性查找异常。 - 索引获取逻辑错误(第28行):
client.index(client)是无效调用,需通过clients.index(client)获取客户端在列表中的索引。
客户端代码错误
- 编码与发送顺序颠倒(第17行):
client.send(nickname).encode('ascii')会先发送字符串,再对send()返回的整数调用encode(),直接触发异常,正确顺序是先编码再发送。 - (可选)函数名拼写修正:
recieve建议改为标准拼写receive,避免语义混淆。 - (可选)异常捕获优化:替换裸
except为具体异常捕获,便于调试时查看错误详情。
修正后的服务器端代码
import socket import threading from signal import signal, SIGPIPE, SIG_DFL signal(SIGPIPE, SIG_DFL) host = '127.0.0.1' # localhost port = 55555 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host, port)) server.listen() clients = [] nicknames = [] def broadcast(message): for client in clients: client.send(message) def handle(client): while True: try: message = client.recv(1024) broadcast(message) except: index = clients.index(client) clients.remove(client) client.close() nickname = nicknames[index] nicknames.remove(nickname) broadcast(f'{nickname} left the chat'.encode('ascii')) break def receive(): while True: client, address = server.accept() print(f'Connected with {str(address)}') client.send('NICK'.encode('ascii')) nickname = client.recv(1024).decode('ascii') nicknames.append(nickname) clients.append(client) print(f'Nickname of the client is {nickname}') broadcast(f'{nickname} joined the chat'.encode('ascii')) client.send('Connected to the server'.encode('ascii')) thread = threading.Thread(target=handle, args=(client,)) thread.start() print('Server is Listening.....') receive()
修正后的客户端代码
import socket import threading nickname = input("Choose a nickname: ") client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 55555)) def receive(): while True: try: message = client.recv(1024).decode('ascii') if message == "NICK": client.send(nickname.encode('ascii')) else: print(message) except Exception as e: print(f"An error occurred: {e}") client.close() break def write(): while True: message = f'{nickname}: {input("")}' client.send(message.encode('ascii')) receive_thread = threading.Thread(target=receive) receive_thread.start() write_thread = threading.Thread(target=write) write_thread.start()
内容的提问来源于stack exchange,提问作者Juggernaut 2.0
相关产品推荐
相关产品推荐

