如何解决这个Python套接字问题?

问题描述 投票:0回答:1

我一直在尝试使用 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()

我该如何解决这个问题?

山姆

python sockets
1个回答
0
投票

经过一番思考后,我明白了问题所在。更多的是服务器中继它,而不是客户端。

这是我的新服务器代码(我更改过):

# 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 进行。

© www.soinside.com 2019 - 2024. All rights reserved.