python - 为什么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 时,服务器端开始永远循环并打印“内部”。没有打印“这里”,所以我确定我从来没有跳出内部 for 循环。这是为什么?忽略我可能做错的所有其他事情,为什么“break”没有脱离while循环?谢谢
解决方案
阅读有关在 Python 中使用套接字的此页面 https://docs.python.org/3/howto/sockets.html#using-a-socket
的 APIsocket.recv
不会引发 EOFError。相反,您应该检查空响应。
sentence = connectionSocket.recv(1024).decode()
if sentence == '':
break
请注意,recv
也不能保证一次接收所有数据,因此您通常希望循环和缓冲传入的数据。它只会在另一端关闭连接(或连接丢失)后返回一个空字符串,因此请确保发送方正在关闭套接字(或以其他方式标记数据结束)。
推荐阅读
- angular - 为什么我必须在数据加载之前点击?
- .net - 如何在 .net 标准项目中存储配置信息
- apache-spark - Spark Shell 的 Spark Session 中不显示新插入的 Hive 记录
- android - I am trying to post an add using my app but no response and server error . I am using Volley Library
- apache-spark - Code to connect to Sharepoint from PySpark
- python - Gremlin 在创建的顶点中添加多标签
- chart.js - Bar charts flickering issue in charts js
- python - 银行收据的 OCR
- terminal - 更改煮熟模式的行为
- getstream-io - 如何使用相同的令牌在 react-activity-feed 组件中作为不同用户发布?