while循环中的Python套接字接收数据不会停止

标签 python python-3.x python-sockets

当我尝试使用 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/

相关文章:

python - Pdfkit 操作系统错误 : No wkhtmltopdf executable found

如果使用getch,Python套接字recv等待发送?

python-2.7 - socket.send() 引发 AttributeError : 'tuple' object has no attribute 'send'

python - 确定性 python 脚本以非确定性方式运行

python - 使用 0.8.8+ 版本在页眉或页脚中添加页码

python - 为 XML 解析创建动态变量

python - 是什么导致该套接字运行速度非常慢?

python - 使用 function 或 var 创建数据框列/索引名称

android - Kivy 和 android 通知

python - 在 openpyxl 中,如何使用 'get_column_letter' 函数设置范围?