2016-03-12 51 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