2015-05-30 3 views
0

После мой сервер код до сих порКак узнать, какой клиент посылает сообщение серверу

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 

Выше только многопоточный функция, принимающая соединения и т.д. Я хочу, чтобы проверить, какой клиент отправил сообщение потому что только одному клиенту разрешено отправлять сообщение за раз. Кроме того, клиент, отправивший сообщение, может отправлять сообщение только после того, как все остальные клиенты отправили сообщения по очереди. Я знаю, что мой вышеприведенный подход «если утверждение» неверен. В приведенном выше коде сервер просто получает сообщение и имя от клиента и отправляет его всем клиентам. Информация о подключенных клиентах хранится в списке

+0

Вы видели [chatserver.py] (https://github.com/circuits/circuits/blob/master/examples/chatserver.py)? –

+1

Кажется, у вас есть это назад. Поскольку это многопоточность, будет задействована несколько потоков, выполняющих эту функцию. Каждый поток будет говорить только с одним клиентом (тот, который вы получаете от 's.accept()'), поэтому, когда вы «recv», нет никаких сомнений в том, из кого он пришел. – crazyhatfish

+0

@ theSmallNothing Я получаю вашу мысль. Но как я могу поместить блокировку на другие потоки, кроме одного из main()? – puffles

ответ

0

Я думаю, что получаю то, что вы ищете. То, что вы хотите, - это система, которая похожа на систему обмена сообщениями , где каждый клиент имеет один поворот, чтобы получить его сообщение повторно.

Для того, чтобы это сработало, вам нужно каким-то образом определить, какая нить поворот.

Способ, которым я бы это сделал, состоит в том, чтобы основная функция увеличивала некоторую глобальную переменную, которую потоки могли сравнивать с их идентификатором (который может быть их индексом информации клиента в массиве all_clients).

Если идентификатор совпадал, тогда нить могла бы быть recv. Основная функция должна была бы знать, когда нужно увеличивать до следующего идентификатора потока, поэтому мы могли бы использовать экземпляр 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() 
+0

Спасибо, кучка !!! – puffles

Смежные вопросы