Python 3.x 如何持续接收来自套接字python的请求

Python 3.x 如何持续接收来自套接字python的请求,python-3.x,sockets,user-interface,server,client,Python 3.x,Sockets,User Interface,Server,Client,我正在学习python中的套接字,并且作为实践,我制作了一个带有文本框、两个输入框和一个按钮的python gui应用程序。它就像一个聊天应用程序,我可以一次运行多个模块,在每个模块中,当用户输入文本并单击“发送”时,它会在用户模块的文本框中显示输入的消息,并打开所有其他模块。我已经让它的大部分工作,但问题是,它只更新文本框时,发送按钮被按下,但我想不断更新,所以一旦一个新的消息被发送,它显示在屏幕上 以下是我目前的代码: #!/usr/bin/python class Application

我正在学习python中的套接字,并且作为实践,我制作了一个带有文本框、两个输入框和一个按钮的python gui应用程序。它就像一个聊天应用程序,我可以一次运行多个模块,在每个模块中,当用户输入文本并单击“发送”时,它会在用户模块的文本框中显示输入的消息,并打开所有其他模块。我已经让它的大部分工作,但问题是,它只更新文本框时,发送按钮被按下,但我想不断更新,所以一旦一个新的消息被发送,它显示在屏幕上

以下是我目前的代码:

#!/usr/bin/python

class Application(tk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.root = tk.Tk()
        self.create_widgets()


    def create_widgets(self):
        ... #code that creates widgets shortended for readability
        #text box widget named self.txt

        self.send_btn["command"] = self.send_msg //this handles sending messages to the server when the button is pressed

        ... #code that creates widgets shortended for readability

    def send_msg(self):
        s = socket.socket()
        host = socket.gethostname()
        port = 9999


        address = (host, port)
        msg=self.name_bar.get() + ": " +self.input_bar.get()
        #name bar is another widget so I can enter an identity for each module
        #input bar is the entry box where text is entered in
        self.input_bar.delete(0, len(msg))

        s.connect(address)
        s.send(msg.encode())

        #Wrote this code that updates textbox when button pushed
        #self.txt.insert(tk.END, s.recv(1024)) 
        #self.txt.insert(tk.END, "\n")

    #Method I created to call constantly to update textbox
    def rcv_msg(self):
        s = socket.socket()
        host = socket.gethostname()
        port = 9999

        address = (host, port)

        s.connect(address)

        if s.recv(1024).decode() != "":
            #self.txt.insert(tk.END, s.recv(1024)) 
            #self.txt.insert(tk.END, "\n")
而且我最近一直在做Java,所以如果我的术语弄错了,我道歉。
我已经做了更新文本框的方法,我只是不知道如何调用它,我尝试了一个while循环,但它只是停止了应用程序的运行。此外,服务器非常简单,只需将上面客户端的消息发送到客户端的所有模块。我不知道代码是否必要,之前有人告诉我要尽量简短,但如果需要,请告诉我。谢谢大家!

你可能会听到一些新信息。不干扰GUI的单独线程。(前面是伪代码!)

崩溃
此项将侦听来自其他连接的新数据,并通过
self.\u app.post\u new\u data(…)
调用
run(self)
操作将它们发布到GUI

    def run(self):
        s = socket.socket()
当我们第一次在一个线程上开始执行时(通过
start()
),我们创建了我们的套接字并开始连接。通过这种方式,所有传入的传输都将通过此路由,以使我们的GUI能够自由地进行它喜欢做的事情(绘制界面、接受用户输入等)

ListenThread.run
上的
while
循环将继续查找新数据,直到我们终止线程。一旦它接收到数据,它就会将该信息推送到我们的
应用程序
。在
post_new_data
功能中,您可以将我们的新数据添加到GUI中,存储它,无论您喜欢什么

    def post_new_data(self, data):
        self.txt.insert(tk.END, data)
        self.txt.insert(tk.END, "\n")

在您的all_data方法中,什么要代替省略号?还有
应用程序
类中的
\u init\u
方法,我是否会将其内容添加到
应用程序
类的
\u init\u
方法中?如果是这样的话,我也试过了,但现在当按下发送按钮时,应用程序不会向服务器发送消息,而且即使在窗口关闭后,模块也不会再关闭。是否应该listener.start是listener.run()?这是很多问题。
all_data
方法可以返回您想要的任何内容。这个想法是,无论何时与应用程序和线程都需要的数据交互,您都应该尝试获取锁。是
start()
正确。这将把执行推到线程。至于“未关闭问题”,您必须确保您
destroy()
应用程序。如果您不想显式调用,也可以查看
atexit
。只是在退出之前终止线程的一些方法。
    def run(self):
        s = socket.socket()
    def post_new_data(self, data):
        self.txt.insert(tk.END, data)
        self.txt.insert(tk.END, "\n")