python - Python socket recv数据在while循环中没有停止
问题描述
当我尝试使用while loop
循环接收数据时,即使没有数据也不会停止
import socket
class Connect:
connect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def __init__(self, server_ip, server_port):
self.connect.connect((server_ip, server_port))
def recv(self):
data_ls = []
while True:
data = self.connect.recv(2048)
if not data: # after getting the first data
break # Python wont come to this "if" so it wont break!
data = data.decode('utf-8')
data_ls.append(data)
return data_ls
解决方案
因为socket.recv
是阻塞调用。这意味着您的程序将暂停,直到它接收到数据。
您可以设置等待数据的时间限制:
socket.settimeout(seconds_to_wait_for_data)
或者,您可以使套接字不阻塞:
sock.setblocking(False)
请注意,在您当前的实现下,您的代码可能会忙于等待数据可用,可能会使用比必要更多的系统资源。您可以通过以下方式防止这种情况:
- 在设置超时(在网络问题的情况下)时寻找开始时服务器没有更多数据的信号(例如
Content-Length
HTTP 的标头) - 使用实现更高级别协议的库
推荐阅读
- java - 在 forEach Java 8 中累积
- python - 如何在python中组合列表的相邻相同元素?
- python - 在 TensorFlow 中从 CSV 文件加载大型数据集
- python - Pandas 根据另一列将列值转换为不同的列
- c++ - 发件人对象名称不存在 | QT & CPP
- github - GitHub PAT 可以跨组织使用吗?
- c - 将冒泡排序从 C 移植到 Rust 时性能严重下降
- java - 如何重用 Spring Kafka 代码来设置多个监听器?
- r - 计数观测值时设置固定值
- c++ - 为什么 ((*i)->getFirstName()) 工作,而不是 *i->getFirstName() 或 Employee[*i]getFirstName()?