Для полного раскрытия это проблема домашней работы.
Необходимо реализовать клиент чата с использованием сокетов, которые имеют связь сервер-клиент (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 совместимости из примеров), но так и не заработал.