使用运行python的多个客户端锁定聊天室

使用运行python的多个客户端锁定聊天室,python,networking,Python,Networking,我正在开发一个基于GUI的聊天程序。 我使用的是其他人的服务器,它对很多人都很好,所以我假设问题出在我的客户机代码上 当我运行一个客户端实例时,它工作得很好,但是如果我在同一台计算机上运行两个客户端实例,当第二个客户端登录时,侦听器将停止响应 # server is from socket module # chat_box is a tkinter ListBox class listener_thread(threading.Thread): def __init__(self, s

我正在开发一个基于GUI的聊天程序。 我使用的是其他人的服务器,它对很多人都很好,所以我假设问题出在我的客户机代码上

当我运行一个客户端实例时,它工作得很好,但是如果我在同一台计算机上运行两个客户端实例,当第二个客户端登录时,侦听器将停止响应

# server is from socket module
# chat_box is a tkinter ListBox
class listener_thread(threading.Thread):
    def __init__(self, server, chat_box):
        super(listener_thread, self).__init__()
        self.server = server
        self.chat_box = chat_box
 
    def run(self):
        try:
            update = self.server.recv(1024)
            msg = update.decode("utf-8")
            if msg != "":
                self.chat_box.insert(END, msg)
        except Exception as e:
            print(e)
我已验证服务器是否将每个客户端放在不同的端口上。服务器正在接收消息。当“Michael”登录并说“Hi”时,他的聊天框会更新。 不过,在“Dave”登录后,客户端不再更新其历史记录。 然而,服务器继续显示它正在从两个客户端接收消息:

Michael-('127.0.0.1',56263)已连接

Dave-('127.0.0.1',56264)已连接

我不确定我应该把这个问题放在哪个委员会上;它可能是网络,也可能是线程。 网络连接工作正常。它只是锁定更新线程的列表框。
没有引发任何异常。

您需要先将chat_history_列表框设置为列表框,而不是None 您需要将接收代码放入一个函数中,带有一个循环和一个退出条件

def receive_func():
    global server, chat_history_listbox
    while True:
        try:
            update = server.recv(1024)
        except OSError as e:
            update = None
            break
            connect()
        msg = update.decode("utf-8")
        if msg != "":
            chat_history_listbox.insert(END, msg)
还需要使线程调用函数并使其成为守护进程

listener = Thread(target=receive_func, daemon=True)
listener.start()
这将与多个客户一起使用