聊天服务器与TKinter Python相结合



我正在尝试为GUI制作一个与TKinter相结合的聊天服务器。在我的客户端中,我通过在这个GUI中输出来自服务器的消息

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)
s.connect(("localhost", 12345))
w = MainWindow()
w.writeln(s.recv(512)) # this works
while w.update():
    socket_list = [s]
    read, _, _ = select.select(socket_list , [], [])
    for sock in read:
        if sock == s: # incomming message from server
            data = sock.recv(512)
            w.writeln(data)

我想做的是检查是否有来自服务器的不协调消息,如果有,我会输出它们。由于某种原因,它被卡住了(在无限循环中?)。有人能告诉我我做错了什么吗?

编辑:w.update()总是true,除非窗口关闭,所以我想这是我的mainloop。我不能使用阻塞套接字I/o,因为这将阻塞GUI事件循环。MainWindow()是TKinter GUI的一部分。

提前感谢!

代码仍然不清楚,但是,我不认为它被困在无限循环中,而是可能在select()语句中被阻塞。

select()获取第四个超时参数(以秒为单位)。如果未提供,则默认为None,并且select()将无限期阻塞。在套接字上调用settimeout()不会对此产生影响。所以select()在等待来自服务器的东西时阻止了你的程序(不管server实际上是什么???不应该是s吗?)

您可以尝试为select()设置超时。或者,查看非阻塞套接字I/O。

最新更新