2014-12-22 87 views
0

我有一個服務器應該接受多個客戶端,但由於某種原因,當它啓動客戶端的新線程時,它不會繼續while循環,直到客戶端已斷開。雖然開始一個新線程後循環不繼續(python)

此外,while循環停止select.select並且不會繼續,直到sock.accept的掛起連接。它也不能正常斷裂,使插座收盤後我self.serverstatus值更改爲0

這裏是服務器

編輯代碼:修正了含線ct.run()來克拉。啓動()

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.bind((self.host, self.port)) 

      inputs = [ s ] 

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

     def client_thread(self, c, addr): 
      print "Connection from: " + str(addr) 
      while True: 
       data = c.recv(1500) 
       print len(data) 
       if not data: 
         break 
       data = str(data).upper() 
       c.send(data) 
       if self.serverstatus == "0": 
         break 
      c.close() 
+0

爲什麼'self.serverstatus'應該在哪裏改變它的值?難道它也可能是while循環保持循環,你只是沒有注意到? –

+0

您需要調用啓動並且不在Thread實例上運行。 –

+0

self.serverstatus在從按鈕切換時應更改值。我試圖在while循環中打印文本來查看它是否確實循環,但由於某種原因它被卡住到包含 「inputready,outputready,exceptready = select.select(inputs,[],[])」的行中「 直到它獲得連接。我通過在頂部和底部有一條打印線進行測試,只有在頂部的代碼被執行,直到傳入的連接允許它繼續。 – Nyoa

回答

2
ct.run() 

我相信你需要start這裏,不run。線程的run方法是線程啓動時將執行的代碼,但調用run實際上並不在單獨的線程中啓動代碼。

ct.start() 
+0

謝謝。現在它工作正常 – Nyoa