当我尝试使用 while 循环
接收数据时,即使没有数据,循环也不会停止
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)
请注意,在您当前的实现下,您的代码可能会是 busy wait使数据可用,可能会使用比必要更多的系统资源。您可以通过以下方式防止这种情况:
- 在设置超时(在出现网络问题的情况下)时寻找信号,以指示何时没有来自服务器的更多数据(例如 HTTP 的
Content-Length
header ) ) - 使用实现更高级别协议(protocol)的库
关于while循环中的Python套接字接收数据不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51316029/