当套接字断开连接时退出Python While Loop

时间:2016-03-12 15:19:29

标签: python sockets python-3.x

我有一些代码从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
>>>**

1 个答案:

答案 0 :(得分:1)

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

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

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

<强>更新

为了捕获超时异常,请将代码包装成:

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

更新2:

在您需要抓住socket.socket.timeout时,似乎正试图抓住socket.timeout。我相信你在最上面使用了这一行:from socket import *。如果是,请尝试抓取timeout而不是socket.timeout。这就是不推荐from ... import *的原因。