使客户端在使用套接字发送消息后立即接收并在python中选择

问题描述

我在python中有一个服务器和客户端脚本,该脚本利用套接字进行选择,脚本允许客户端在本地服务器上相互发送消息,问题是您必须在代码更新之前发送消息,并且使您可以接收其他人发送的消息。我尝试实现按键操作,例如按“ c”进行聊天(然后在等待输入时接收代码将不断运行),但是当一个用户单击“ c”时,服务器上的每个人都进入了聊天模式,从而破坏了整个目的。以下是一些摘要

客户端:

def chat():
    return input(f"{my_username} > ")

while True:
    # message = input(f"{my_username} > ")
    if keyboard.is_pressed('c'):  # if key 'c' is pressed then enter chat mode 
        print('\nChat mode active!')
        message = chat() # Now gets user input
    else:
        message = "" # otherwise send an empty message (which translates to 'update the code')

    if message: # if message is not empty
        message = message.encode("utf-8")
        message_header = f"{len(message):<{HEADER_LENGTH}}".encode("utf-8")
        client_socket.send(message_header + message)

    try:
        while True:
            # receive messages
            username_header = client_socket.recv(HEADER_LENGTH)

            if not len(username_header): # didn't receive any data
                print("Connection closed by server")
                sys.exit()
            
            username_length = int(username_header.decode("utf-8").strip())
            username = client_socket.recv(username_length).decode("utf-8")

            message_header = client_socket.recv(HEADER_LENGTH)
            message_length = int(message_header.decode("utf-8").strip())
            message = client_socket.recv(message_length).decode("utf-8")

            print(f"{username} > {message}")
            // a bunch of exception blocks follows this

然后您有一些服务器代码

while True:
    read_sockets,_,exception_sockets = select.select(sockets_list,[],sockets_list)

    for notified_socket in read_sockets:
        if notified_socket == server_socket: # if someone just connected
            client_socket,client_address = server_socket.accept()
            user = receive_message(client_socket)

            if not user:
                continue

            sockets_list.append(client_socket)
            clients[client_socket] = user

            print(f"Accepted new connection from {client_address[0]}:{client_address[1]}. Username: {user['data'].decode('utf-8')}")
        else:
            message = receive_message(notified_socket)

            if not message:
                print(f"Closed connection from {clients[notified_socket]['data'].decode('utf-8')}")

                sockets_list.remove(notified_socket)
                del clients[notified_socket]
                continue

            user = clients[notified_socket]
            print(f"Received message from {user['data'].decode('utf-8')}: {message['data'].decode('utf-8')}")

            for client_socket in clients:
                # we do not want to echo the message back to the sender
                if client_socket != notified_socket:
                    client_socket.send(user['header'] + user['data'] + message['header'] + message['data'])

    for notified_socket in exception_sockets:
        sockets_list.remove(notified_socket)
        del clients[notified_socket]

我刚刚开始学习套接字,所以我不确定如何将客户端100分开,因此,如果一个客户端按下“ c”键进入聊天模式,则其他所有客户端都会收到相同的消息,说他们是在聊天中更多,并且可以开始发送消息(如图所示)

两个客户端收到相同的“ c”按键信号

The two clients receiving the same 'c' keypress signal

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)