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