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

时间:2015-05-30 09:59:41

标签: python client-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”不正确。 在上面的代码中,服务器只是从客户端接收消息和名称并将其发送给所有客户端。连接的客户信息存储在列表

1 个答案:

答案 0 :(得分:0)

我想我得到你想要的东西。你想要的是一个像循环消息传递系统的系统,每个客户端都有一个来重新传输消息。

为了使这个工作起作用,您需要确定哪个线程的

我这样做的方法是让main函数增加一些全局变量,线程可以将它们与它们的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()