微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 break 不会在 except 子句中跳出 whileloop

如何解决为什么 break 不会在 except 子句中跳出 whileloop

所以我正在为一个简单的套接字编写代码

    while True:
        print('here')
        connectionSocket,addr = serverSocket.accept()
        while True:
            print('inside')
            try:
                sentence = connectionSocket.recv(1024).decode()
            except EOFError:
                connectionSocket.close()
                break

这个想法是,一旦客户端发送EOF,连接套接字就会关闭,我们跳出while循环并等待下一个客户端连接。我不明白的是,当我尝试运行它并向服务器发送 EOF 时,服务器端开始永远循环并打印“内部”。没有打印“here”,所以我确定我从未脱离内部 for 循环。这是为什么?忽略我可能做错的所有其他事情,为什么“break”没有跳出 while 循环?谢谢

解决方法

阅读有关在 Python 中使用套接字的页面 https://docs.python.org/3/howto/sockets.html#using-a-socket

socket.recv 的 API 不会引发 EOFError。相反,您应该检查是否有空响应。

sentence = connectionSocket.recv(1024).decode()
if sentence == '':
    break

请注意,recv 也不能保证一次接收所有数据,因此您通常希望循环并缓冲传入的数据。一旦另一端关闭连接(或连接丢失),它只会返回一个空字符串,因此请确保发送方正在关闭套接字(或以其他方式以某种方式标记数据结束)。

,

我不知道为什么你没有跳出循环,但是——假设错误真的触发了——你可以跳出它并抛出异常:

while True:
    print('here')
    connectionSocket,addr = serverSocket.accept()
    try:
        while True:
            print('inside')
            sentence = connectionSocket.recv(1024).decode()
    except EOFError:
        connectionSocket.close()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。