如何知道哪个客户端正在向服务器发送消息

How to know which client is sending message to the server

到目前为止,以下是我的服务器代码

def multipleClients():
    global counter=0
    conn, addr = s.accept()
    counter=counter+1
    all_clients.append(conn)
    print "is connected :D :)", addr
    i=0
    name= conn.recv(1024)
    while True:
        while i<counter:
            if all_clients[counter] == conn  #comparing the current client with the one which sent the message:
                name=conn.recv(1024)
                data= conn.recv(1024)
                if not data:
                    break
                print repr(name),":"
                print "message is :", repr(data)
                for c in all_clients:
                    n= name,":"
                    c.sendall(data)
    counter=0

以上只是接受连接等的多线程函数。 我想检查哪个客户端发送了消息,因为一次只允许一个客户端发送消息。而且,发送消息的客户端只有在所有其他客户端都轮流发送消息后才能再次发送消息。我知道我的上述方法 "if statement" 是不正确的。 在上面的代码中,服务器只是从客户端接收消息和名称并将其发送给所有客户端。连接的客户端信息存储在列表

我想我明白你要找的东西了。你想要的是一个类似于 round-robin 消息传递系统的系统,其中每个客户端都有一个 turn 来重新传输其消息。

为了使其正常工作,您需要通过某种方式识别哪个线程的 turn

我这样做的方法是让主函数增加一些全局变量,线程可以将其与它们的 id(可以是它们在 all_clients 数组中的客户端信息索引)进行比较。

如果 id 匹配,则线程可以 recv。主函数需要知道何时递增到下一个线程 ID,因此我们可以使用 Event 实例并在收到消息后 set 它。

# in this example, current_id and recvd_event are global variables, since global variables
#  are generally considered a bad coding practice they also could be wrapped in a class and
#  passed in.

def multipleClients():
    conn, addr = s.accept()

    # the number of clients at this moment is unique, so we can use it as an id
    client_id = len(all_clients) 
    all_clients.append(conn)

    # .. do other stuff ..

    while True:
        if client_id == current_id:
            # receive, retransmit, etc..
            recvd_event.set()

def main():
    global current_id
    # .. set up server ..
    current_id = 0
    recvd_event = threading.Event()
    while True:
        # .. select incoming connection ..
            # .. create thread ..
        if recvd_event.isSet():
            # received a message, next thread's turn
            # increments current_id and wraps around at end of client list
            current_id = (current_id + 1) % len(all_clients)
            recvd_event.clear()