我一直在尝试使用 python 和套接字模块创建一个聊天室,但我遇到了一个我不知道如何修复的错误。
目前,当我通过其中一个客户端发送一条消息时,该消息将在发送者的终端中再次输出。例如。第 3 列,第 1 行和第 3 行(第 3 列是吉姆的)。
这是我为客户端编写的代码(重新接收/发送数据):
# Receive data from server
def receive_data():
while True:
try:
mes = client.recv(1024).decode('ascii')
# If the message is 'name', send name to server
if mes == 'name':
client.send(name.encode('ascii'))
# If the message comes from the same person, don't show it
elif name == mes[0:(len(name)+1)]:
pass
# Otherwise it will print the message
else:
print(mes)
except:
# Close the connection
print(f"{colours.Colours.red}An error occurred!{colours.Colours.end}")
client.close()
break
# Send data to server
def send_data():
while True:
message_to_send = input("You : ")
mes = f"\n{name} : {message_to_send}"
client.send(mes.encode('ascii'))
这是我为服务器写的。全部设置完成后,运行接收功能。顺便说一句,协议是 TCP。
# Handling clients
def handle_clients(client):
while True:
try:
# Broadcasting messages
mes = client.recv(1024)
broadcast(mes)
except:
# Removing clients
name = clients[client]
broadcast(f"{colours.Colours.red}{name} has left!{colours.Colours.end}".encode('ascii'))
del clients[client]
break
# Recieving data
def recieve():
while True:
# Accept connection
conn, addr = server.accept()
print(f"{colours.Colours.green}Connected with {addr}!{colours.Colours.end}")
# Request & store name
conn.send("NAME".encode('ascii'))
name = conn.recv(1024).decode('ascii')
clients.update({conn : name})
# Start handling thread for client
thread = threading.Thread(target=handle_clients, args=(conn,))
thread.start()
我该如何解决这个问题?
山姆
经过一番思考后,我明白了问题所在。更多的是服务器中继它,而不是客户端。
这是我的新服务器代码(我更改过):
# If the name of the sender is the same as in the message, return True
def check_name(name, client_name):
client_name = client_name[0]
if name == client_name:
return True
else:
return False
# Send message to all clients
def broadcast(message, ignore=False):
for client, name in clients.items():
if not ignore:
client.send(message.encode('ascii'))
else:
if check_name(ignore, name):
pass
else:
client.send(message.encode('ascii'))
# Handling clients
def handle_clients(client):
while True:
try:
# Decode message
mes = client.recv(1024).decode('ascii')
if not mes:
break
# Get the name of the sender
name = mes.split(" : ")
name = name[0]
name = name.replace('\n', '')
name = name.strip()
mes = mes.replace('\n', '')
# Broadcast
broadcast(mes, ignore=name)
except:
# Removing clients
name = clients[client]
broadcast(f"{colours.Colours.red}{name} has left!{colours.Colours.end}".encode('ascii'))
del clients[client]
break
这是我的新客户代码:
# Recieve data from server
def receive():
while True:
try:
mes = client.recv(1024).decode('ascii')
# If the message is 'NAME', send the name to server
if mes == 'NAME':
client.send(name.encode('ascii'))
# Otherwise it will print the message
else:
print(mes)
except:
# Close the connection
print(f"{colours.Colours.red}An error occurred!{colours.Colours.end}")
client.close()
break
# Send data to server
def send():
while True:
message_to_send = input("You : ")
mes = f"\n{name} : {message_to_send}"
client.send(mes.encode('ascii'))
这个答案是作为问题编辑发布的 如何解决这个 python 套接字问题? (已解决) 由 OP Sam Winkworth 根据 CC BY-SA 4.0 进行。