【问题标题】:Python chat clients not updatingPython 聊天客户端未更新
【发布时间】:2020-03-20 04:27:34
【问题描述】:

我正在开发一个基于 GUI 的聊天程序。
我正在使用其他人的服务器,该服务器对很多人都运行良好,所以我假设问题出在我客户的代码上。
当我运行客户端的单个实例时,它可以完美运行,但是如果我在同一台计算机上运行客户端的两个实例,则侦听器会在第二个客户端登录时停止响应。

# server is from socket module
# chat_box is a tkinter ListBox
# both are copies of global variable
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)

我已验证服务器将每个客户端放在不同的端口上。服务器正在接收消息。当“迈克尔”登录并说“嗨”时,它会在他的聊天框中更新。
不过,在“戴夫”登录后,客户不再更新他们的历史记录。
然而,服务器继续显示它正在接收来自两个客户端的消息。

#This is the server output
#Hi is Michael
#Yo is Dave
#So Michael is still connecting and transmitting after Dave connects

   Michael - ('127.0.0.1', 56263) connected
Hi
   Dave - ('127.0.0.1', 56264) connected
Yo
Hi

网络连接正常。它只是锁定 list_box 更新线程。
没有异常被抛出。

【问题讨论】:

    标签: python-3.x multithreading sockets tkinter


    【解决方案1】:

    我解决了自己的问题。
    我最初需要将 chat_history_listbox 设为 ListBox,而不是 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()
    

    这使它与多个客户一起工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-27
      • 2015-10-12
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2015-06-01
      相关资源
      最近更新 更多