Отправка обновленного списка клиентов с использованием сокетов TCP со ссылками сервер-клиент и клиент-клиент - PullRequest
0 голосов
/ 12 февраля 2019

Для полного раскрытия это проблема домашней работы.

Необходимо реализовать клиент чата с использованием сокетов, которые имеют связь сервер-клиент (TCP) и клиент-клиент (UDP).Сервер поддерживает список клиентов и отказывается разрешать подключения от людей с повторяющимися именами, а также передает этот список клиентам, чтобы они могли общаться друг с другом.

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

Я использую Python3, pickle для отправки данных и многопоточность.

# from chatServer.py
while True:
    conn, addr = server.accept()
    conn_list = []
    conn_list.append(conn)
    thread = Thread(target=connect_attempt(conn, addr))
    thread.start()
    for con in conn_list:
        con.sendall(pickle.dumps(client_list_str))
# client_list_str gets updated by connect_attempt() and contains
# the list of clients. It's a string because there was a specific format
# required, and a list or dictionary seemed difficult. I parse it later.

*********************************************

# from chatClient.py
def listen():
    # ... 
    # send authentication string to server

    while True:
        new_client_msg = server.recv(4096)
        if new_client_msg:
            new_client_msg = pickle.loads(new_client_msg)
            if 'RJCT' in new_client_msg:
                print(new_client_msg)
                sys.exit(0)
            elif 'ACPT' in new_client_msg:
                # incoming new_client_msg will contain all clients
                client_list = new_client_msg.split(':')
                for client in client_list:
                    clients.append(client.split('\xa4'))
                # delete ACPT tag from server
                del clients[0][0]
                for client in clients:
                    # create list with ip and port
                    addr_list.append(client[1])
                    addr_list.append(int(client[2].replace('\\n','')))
# addr_list is later used to send messages out

Ожидаемый: каждый клиент постоянно прослушивает обновленный список клиентов.

Actual: Когда подключается новый клиент, он получает последний список клиентов.Любой, кто подключился до этого, не обновляется.

Объяснение: Это потому, что метод connect_attempt (), который содержит обновленный client_list_str, вызывается только при создании нового соединения.Это то, что я понимаю;я не понимаю, как заставить потоки общаться друг с другом.Я пробовал многие решения для SO, включая пул потоков и организацию очередей (не смог заставить его реализовать и отказаться, даже после исправления 2 -> 3 совместимости из примеров), но так и не заработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...