2015-01-06 70 views
1

我有一个服务器套接字,用于侦听传入连接并为每个客户端创建新套接字。我有一个while循环来保证服务器负责(当没有连接时,可以使用按钮关闭它),并且我使用.select来检查是否有任何连接。我遇到的问题是.select由于某种原因被阻塞。它等到有连接而不是检查连接然后继续。python .select阻塞

def serverstart(self): 
     self.buttonswitch("1") 
     self.host = self.intip 
     self.port = 5000 
     s = socket.socket(socket.AF_INET6) 
     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     s.setblocking(0) 
     s.bind((self.host, self.port)) 

     inputs = [ s ] 

     s.listen(5) 
     self.serverstatus = "1" 
     while s: 
      inputready, outputready, exceptready = select.select(inputs, [], []) 
      if inputready == inputs and self.serverstatus == "1": 
        print inputready 
        c, addr = s.accept() 
        ct = threading.Thread(target=self.client_thread, args=[c, addr]) 
        ct.start() 
      if self.serverstatus == "0": 
        break 
     s.close() 
     print "Closing socket" 
     self.buttonswitch("0") 

编辑:

添加超时用于工作非阻塞选择溶液

  inputready, outputready, exceptready = select.select(inputs, [], [], 0.1) 
+0

_ ...“使用按钮来关闭它”所以这是一个图形用户界面的一部分? GUI是否有自己的处理套接字的方法? – tdelaney

回答

3

第四个参数,以select是超时。根据该文档:

可选超时参数指定超时作为以秒为浮点数。当超时参数是省略功能块,直到至少有一个文件描述符准备就绪。

如果你想避免默认行为,你应该修改你的调用以包含可选参数。例如,select(inputs, [], [], 1)

Python Select Docs

+0

使用'0'轮询而无需等待。 – tdelaney

+0

您提供的解决方案的工作,谢谢。我实际上在0之前尝试了超时,但由于某些原因,它无法正常工作。 – Nyoa