2015-01-06 45 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