只有一个客户端在多个客户端的服务器中接收消息

ONLY one client receive message in multiple client's server

我的目标是在客户端屏幕上打印来自函数 result 的消息。但是只有一个客户端可以收到消息...


client.py的部分在这里

def PlayGame(clientSocket, msg):
invalid = "NO!"
if ("/guess " in msg):
    msg1 = msg.split(" ")[1]
    print("Hi1\n")
    if msg1 == "true" or msg1 == "false":
        print("Hi11")
        clientSocket.send(msg1.encode())
        print(clientSocket.recv(1024).decode())
        print("!")
        return '1'

    else:
        clientSocket.send(invalid.encode())
        print(clientSocket.recv(1024).decode())
        print("2")
        return '2'
elif msg == "":
    return '2'
else:
    clientSocket.send(invalid.encode())
    print(clientSocket.recv(1024).decode())
    print("3")
    return '2'

def main(argv):
            msg=""
            while (PlayGame(clientSocket, msg)!=1):
                msg = input()

server.py

的任何部分
guess_box = []
guess = bool(random.randint(0, 1))
    def result(connectionSocket, guess_box,  addr, addr_l):
        a = 0
        if(guess_box[0] == guess_box[1]):
            msg = "Tie!!"
            connectionSocket.send(msg.encode())
            return '2'
        elif(guess_box[0] == guess):
            msg = "Player 1 Wins!"
            a+=1
            connectionSocket.send(msg.encode())
            return '2'
        elif(guess_box[1] == guess):
            msg = "Player 2 Wins!"
            a+=1
            connectionSocket.send(msg.encode())
            return '2'
    
    def TF(connectionSocket, var, guess_box, addr, addr_l):
        msg = connectionSocket.recv(1024).decode()
        print("recv:",msg)
        if(msg == 'true'):
            msg = 'True'
            var = str(var)
            msg = bool(msg == var)
            guess_box.append(msg)
            return 'ok'
        elif(msg == 'false'):
            msg = 'False'
            var = str(var)
            msg = bool(msg == var)
            guess_box.append(msg)
            return 'ok'
        else:
            print(msg)
            statement = "4002 Unrecognized message!!"
            connectionSocket.send(statement.encode())
            return 'again'
class ServerThread(threading.Thread):
    def __init__(self, client):
        threading.Thread.__init__(self)
        self.client = client

    def run(self):
    ...
    print("guess is:", guess)
    
                    while (len(guess_box) != 2):
                        TF(connectionSocket, guess, guess_box, addr, addr_l)
    
                    print("start")
                    result(connectionSocket, guess_box, addr, addr_l)
    ...

仅针对您解决的一个问题:

print the message from function result on the client's screen. But only ONE client can received the message

问题来自于为每个客户端使用不同的线程。最先收到猜测的线程停留在其

                        while (len(guess_box) != 2):
                            print(guess_box)
                            TF(connectionSocket, guess, guess_box)

循环并等待另一条消息,但没有收到。作为第二个接收猜测的线程仅将结果发送给自己的客户端。

我认为在保持这种 d 线程方法的同时,没有一种明智的方法来解决这个问题。

Can I change the structure of my code by using those functions I implemented?

这是 server_runwhile True 循环的替代品,不需要更改 这些功能 除了 server_run

        from select import select
        connections = []
        room_connection = {}
        for reads in iter(lambda: select([serverSocket]+connections, [], [])[0], []):
            for ready in reads: # for each socket which select reports is readable
                if ready == serverSocket:   # it's the server socket, accept new client
                    connectionSocket, addr = serverSocket.accept()
                    connections.append(connectionSocket)# store the connection socket
                    while RecvFromClient(connectionSocket) == "NO": pass
                else:           # message (or disconnect) from a client
                    try: var = GameHallMsg(ready, ready, connections)
                    except socket.error: var = 'bye'
                    if var == 'bye':    # client finished, remove from list
                        connections.remove(ready)
                        ready.close()
                    elif var == 'wait': # store first player's connection
                        room_connection[current_rm_num.pop()] = ready
                    elif var == 'NO':
                        rtn_msg_4 = "4002 Unrecognized message"
                        ready.send(rtn_msg_4.encode())
                    elif var == 'jump':
                        readyroom = current_rm_num.pop()
                        # find and notify other player in the room
                        other = room_connection.pop(readyroom)
                        rtn_msg_2 = "3012 Game started. Please guess true or false"
                        other.send(rtn_msg_2.encode())
                        print("guess is:", guess)
                        # query and inform both players
                        guess_box = []
                        while TF(ready, True, guess_box) != 'ok': pass
                        while TF(other, True, guess_box) != 'ok': pass
                        result(ready, guess_box, ('', 0), [0])
                        result(other, guess_box, ('', 1), [0, 1])
                        room[readyroom] = 0