我正在尝试为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。