Chatserver结合TKinter Python

时间:2015-11-10 21:17:18

标签: python server

我试图将一个与TKinter结合使用的聊天服务器用于GUI。在我的客户端中,我通过以下方式从此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的一部分。

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

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

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