2016-03-12 47 views
2

我有一些代码从Raspberry Pi接收WiFi密码。 Pi每2分钟发一个新代码。下面的脚本检查密码并根据需要更新与新密码的连接。当套接字断开连接时退出Python While Loop

 # Create a TCP/IP socket 

s=socket(AF_INET, SOCK_DGRAM) 


# Bind the socket to the port 
s.bind (('',4446)) 
s.settimeout(10.0) 
print ("Listening . . . .") 

data=s.recv(1024).decode() 
print ("Password: "+data) 
os.system('netsh wlan set profileparameter name=PI_AP Keymaterial='+data) 
var1=data 

try: 
    while 1: 
     data=s.recv(1024).decode() 
     print ("Password: "+data) 

     if var1!=data: 
      os.system('netsh wlan set profileparameter name=PI_AP Keymaterial='+data) 
      print ("Password: "+data) 
      var1=data 

except socket.timeout: 
    print ("Timed Out") 

这里是输出,与我看到错误消息后我断开:

>>> ================================ RESTART ================================ 
>>> 
Listening . . . . 
Password: m9FyvpJCILQrZB4sq125AfUn9nfS9Z6qDlbBxy12pL48y5kJTLrH01osp4xXWN3 
Password: m9FyvpJCILQrZB4sq125AfUn9nfS9Z6qDlbBxy12pL48y5kJTLrH01osp4xXWN3 
Password: m9FyvpJCILQrZB4sq125AfUn9nfS9Z6qDlbBxy12pL48y5kJTLrH01osp4xXWN3 
**Traceback (most recent call last): 
    File "C:\Users\cave\Desktop\system_V1\UAD-V1.0.py", line 21, in <module> 
    data=s.recv(1024).decode() 
socket.timeout: timed out 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Users\cave\Desktop\system_V1\UAD-V1.0.py", line 29, in <module> 
    except socket.timeout: 
TypeError: catching classes that do not inherit from BaseException is not allowed 
>>>** 
+0

难道你不能'而数据:'而不是? –

回答

1

您会收到一个插座断开的异常,或空数据(如你在测试如果)在断开连接的情况下。

如果您没有收到异常(有点尴尬),您可以使用select(低级别)或selectors(高级别)模块来查看您是否收到线上的数据。

您可以设置2分钟的超时时间,此后select()函数将抛出异常。

UPDATE:

为了赶上超时异常,包装你的代码是这样的:

try: 
    while 1: 
     ... 
except socket.timeout: 
    print("timed out") 
... 

更新2:

好像你正在试图赶上socket.socket.timeout,同时你需要赶上socket.timeout。我相信你在上面使用了这条线:from socket import *。如果是这样,请尝试捕获timeout而不是socket.timeout。这就是不推荐使用from ... import *的原因。

+0

感谢您的快速回复。 我得到异常: 回溯(最近通话最后一个): 文件 “C:\用户\洞穴\桌面\ system_V1 \ UAD-V1.0.py” 23行,在 s.recv( 1024).decode() socket.timeout:超时。 但我不确定如何处理这种方式,以便我退出循环。 – Jimdog

+0

在While looop之后测试我使用了print(“Success”)。我看到了断开连接异常,但不是'成功'消息。 – Jimdog

+0

@Jimdog更新回答。 – Bharel