2011-05-11 88 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返回,它实际上会读取一些数据。