2011-05-11 144 views
2

我通過套接字模塊從某個設備接收數據。 但過了一段時間後,設備停止發送軟件包。 然後我想插入for循環。 雖然True不起作用,因爲他收到了超過100個包裹。 我該如何阻止這個過程? s表示插座。Python:停止套接字接收進程

... 
for i in range(packages100): 
    data = s.recv(4) 
    f.write(data) 
... 

編輯: 我認爲socket.settimeout()是解決方案的一部分。另請參見: How to set timeout on python's socket recv method?

+0

是不是有辦法找出客戶端要收回多少包? – bpgergo 2011-05-11 12:24:58

+0

停止進程不是問題。問題在於決定何時這樣做。什麼是標準? – Kylotan 2011-05-11 13:34:24

+0

我想在一秒鐘後停止該過程而不接收數據。 – kame 2011-05-11 13:48:41

回答

2
while 1: 
    data = conn.recv(4) 
    if not data: break 
    f.write(data) 

此外,example in python docs

+0

只有當對方關閉連接時纔有效 – 2011-05-11 12:20:52

+0

啊,我明白了。所以「設備停止發送軟件包」並不等同於關閉軟件。 – bpgergo 2011-05-11 12:23:46

+1

嗯,也許也許不是,我不能確定OP的含義。我只是想指出區別 – 2011-05-11 12:24:35

3

如果你的同行真的只是停止發送數據,而不是關閉連接,這是棘手的,你會被迫採取從異步讀取這個插座。

將它置於異步模式(文檔和Google是你的朋友),並嘗試每次閱讀它,而不是阻塞閱讀。然後,您可以隨時停止「試用」,隨時隨地希望。請注意,通過異步IO的本質,您的代碼將有所不同 - 您將不再能夠假設一旦recv返回,它實際上會讀取一些數據。