Skip to main content
 首页 » 编程设计

python之套接字断开连接时退出 Python While 循环

2025年04月02日29JustinYoung

我有一些代码可以从 Raspberry Pi 接收 WiFi 密码。 Pi 每 2 分钟发出一个新代码。下面的脚本检查密码并在需要时使用新密码更新连接。

        # 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 
>>>** 

请您参考如下方法:

在断开连接的情况下,您应该收到套接字断开连接异常或空数据(如您在 if 中测试的那样)。

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

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

更新:

为了捕获超时异常,请像这样包装您的代码:

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

更新 2:

您似乎在 try catch socket.socket.timeout 而您需要捕获 socket.timeout。我相信您在顶部使用了这一行:from socket import *。如果是这样,请 try catch timeout 而不是 socket.timeout。这就是不推荐 from ... import * 的原因。