python socket编程 recv超长文本问题

269 阅读1分钟

最近在做socket编程的作业,遇到一个问题纠缠了我十几个宝贵的小时

image.png 在使用socket收发长达1MB的文件分块时,会莫名出现recv收到的文件长度并不是我send的文件长度,即使在我提前send了接下来要发送的字符长度,并设置recv需要接收的字符长度的情况下依然不能正确收发,会出现收到的字符串过短和超长的奇奇怪怪的bug

最后,在请教chatGPT之后,怀疑是recv没能完整的接收客户端/服务端send的全部字符,遂对recv进行了如下的调整,循环接收缓冲区的内容

def recvall(sock, n):
    # 用于接收完全的数据
    data = bytearray()
    while len(data) < n:
        packet = sock.recv(n - len(data))
        if not packet:
            return None
        data.extend(packet)
    return data
chunk_data_raw = recvall(s, chunk_length) #chunk_length是字符长度
if chunk_data_raw is not None:
    chunk = chunk_data_raw.decode()

进行如上的调整后,每次指定长度的字符都能被正常接收。

应该是recv缓冲区的问题,但本人第一次有这么大文本传输的需求,也是第一次碰到这个问题,有没有糕手为小弟解释一下原因