【问题标题】:Exit Python While Loop when socket disconnects套接字断开连接时退出 Python While 循环
【发布时间】:2016-03-13 01:53:29
【问题描述】:

我有一段代码可以从 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
>>>**

【问题讨论】:

  • 不能用while data: 代替吗?

标签: python sockets python-3.x


【解决方案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 * 的原因。

【讨论】:

  • 感谢您的快速回复。我确实得到了异常: Traceback(最近一次调用最后一次):文件“C:\Users\cave\Desktop\system_V1\UAD-V1.0.py”,第 23 行,在 s.recv(1024) 中。 decode() socket.timeout:超时。但我不确定如何以某种方式处理这个问题,以便我退出循环。
  • 测试我在 While 循环之后使用了 'print ("Success")。我看到了断开连接异常,但没有看到“成功”消息。
  • @Jimdog 更新了答案。
  • 这次不同的错误,但我可以看到它尝试以某种方式处理异常... Traceback(最近一次调用最后一次):文件“C:\用户\洞穴\桌面\系统V1\ UAD-V1.0.py", line 21, in data=s.recv(1024).decode() socket.timeout: timed out 在处理上述异常的过程中,又发生了一个异常:Traceback(最近一次调用最后):文件“C:\Users\cave\Desktop\system_V1\UAD-V1.0.py”,第 29 行,在 中,除了 socket.timeout:TypeError:不允许捕获不继承自 BaseException 的类
  • 我不完全确定那里发生了什么,你能用更新的脚本和异常编辑你的问题吗? (在 cmets 中很难看到)
猜你喜欢
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多