使用带有服务器-客户端和客户端-客户端链接的TCP套接字发送更新的客户端列表

时间:2019-02-12 01:47:33

标签: python sockets

要全面披露,这是一个作业问题。

需要使用具有服务器-客户端(TCP)和客户端-客户端(UDP)通信的套接字来实现聊天客户端。服务器维护一个客户端列表,并拒绝允许具有重复名称的人员进行连接,还将该列表推送给客户端,以便他们可以相互通信。

我无法使客户端已经连接以获取更新的列表。当新客户端连接时,他们将获得正确的列表,并且能够与其他人进行通信。

我正在使用Python3,泡菜发送数据和进行线程处理。

# 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

预期:每个客户端都在不断监听更新的客户端列表。

实际:新客户端连接时,它将收到最新的客户端列表。在此之前连接的任何人都不会更新。

说明:这是因为仅在建立新连接时才调用包含更新的client_list_str的connect_attempt()方法。我明白了很多;我不明白的是如何使线程彼此通信。我已经尝试了许多关于SO的解决方案,包括线程池和排队(即使在修复了示例中的2-> 3兼容性之后,也无法实现并放弃该解决方案),但从未成功。 / p>

0 个答案:

没有答案