要全面披露,这是一个作业问题。
需要使用具有服务器-客户端(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>