首页 > 解决方案 > 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

标签: pythonpython-3.xpython-sockets

解决方案


因为socket.recv是阻塞调用。这意味着您的程序将暂停,直到它接收到数据。

您可以设置等待数据的时间限制:

socket.settimeout(seconds_to_wait_for_data)

或者,您可以使套接字不阻塞:

sock.setblocking(False)

请注意,在您当前的实现下,您的代码可能会忙于等待数据可用,可能会使用比必要更多的系统资源。您可以通过以下方式防止这种情况:

  • 在设置超时(在网络问题的情况下)时寻找开始时服务器没有更多数据的信号(例如Content-LengthHTTP 的标头)
  • 使用实现更高级别协议的库

推荐阅读