2013-03-04 45 views
0

我是套接字編程的新手(對Python也有所不同),並且我無法按照自己想要的方式(在服務器端)按選擇超時工作。客戶端連接之前,超時工作正常。我給它1秒的值,超時在我的循環中每1秒鐘到期。如何在select中正確使用timeout參數?

但是,一旦客戶端連接,它不會等待1秒鐘告訴我超時到期。它只是儘可能快地循環,並告訴我超時到期。下面是我的代碼片段:

while running: 
    try: 
     self.timeout_expired = False 
     inputready, outputready, exceptready = select.select(self.inputs, self.outputs, [], self.timeout) 
    except select.error, e: 
     break 
    except socket.error, e: 
     break 

    if not (inputready): 
     # Timeout expired 
     print 'Timeout expired' 
     self.timeout_expired = True 

    # Additional processing follows here 

我不知道這是否是足夠的代碼,看看我的問題是,那麼請讓我知道如果你需要看到更多。基本上,客戶端連接後,至少出現,它忽略1秒的超時,並運行得儘可能快,不斷告訴我「超時過期」。任何想法我失蹤?

非常感謝!

編輯:我應該澄清...「inputready」代表從客戶端連接或發送數據到服務器的輸入,以及來自服務器的stdin。從select返回的其他變量只是服務器端變量,而我試圖做的是檢測客戶端是否花了太長時間來回復,所以我只檢查輸入是否爲空。

+0

而'如果inputready'? – 2013-03-04 05:33:58

+0

如果輸入已準備就緒,則服務器通過輸入準備中的每個套接字循環並執行附加處理。 – MattM 2013-03-04 05:36:43

回答

1

如果inputreadyoutputreadyexceptready全部爲空,則只有超時。我的猜測是您已將客戶端套接字添加到self.inputsself.outputs。由於輸出插座通常是可寫的,因此它將始終顯示在outputready中。如果您準備輸出某些內容,則只需將客戶端套接字添加到self.outputs即可。

+0

啊,謝謝。是的,你的猜測是真實的。我一直在使用self.outputs來輕鬆地跟蹤誰準備發送消息。我想我可以通過self.input循環,並將其添加到self.outputs,當我準備好向所有客戶端輸出內容時... 感謝您的時間! – MattM 2013-03-04 06:05:23

+0

我最終將輸出填充到另一個變量中,並在發送消息之前將它們全部引入self.outputs(然後在發送後將其刪除)。值得慶幸的是,這一切都可以從一個地方完成。「否則將會是一個真正的痛苦。謝謝你的幫助!如果我現在還沒有解決這個問題的話,我在路上晚了很多時間給我留下了...... – MattM 2013-03-04 06:31:26

相關問題