接收带有套接字的大型pickle对象时的无限循环

2024-05-17 19:15:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是一个远程linux服务器,我想用python从客户端通过套接字发送一个数组,所以我使用了以下代码:

message = pickle.dumps(faceBlob)
message_header = bytes(f"{len(message):<{HEADER_LENGTH}}", "utf-8")
client_socket.send(message_header + message)

为了在服务器中接收它,我使用while循环捕获所有消息,因为它是>;4096:

def receive_blop(client_socket):
    # Receive our "header" containing message length, it's size is defined and constant
    message_header = client_socket.recv(HEADER_LENGTH)

    # If we received no data, client gracefully closed a connection, for example using socket.close() or socket.shutdown(socket.SHUT_RDWR)
    if not len(message_header):
        return False

    # Convert header to int value
    message_length = int(message_header.decode('utf-8').strip())
    fragments = []
    print(message_length)

    while True:
        # this loop is infinite

        print("I arrived her")
        chunk = client_socket.recv(4096)
        if not chunk:
            break
        fragments.append(chunk)

    data_arr = b"".join(fragments)


    # Return an object of message header and message data
    return {'header': message_header, 'data': data_arr}

服务器仍在打印“我到了这里”,但会接收消息,直到客户端的连接结束


Tags: 服务器client客户端messagedatalensocketlength
1条回答
网友
1楼 · 发布于 2024-05-17 19:15:06

循环将继续,直到客户端关闭连接。如果他们在收到你的回复之前不关闭,你就陷入了僵局

因为您知道消息的长度,所以可以在收到那么多字节时停止循环

    received_length = 0
    while received_len < message_length:

        print("I arrived her")
        chunk = client_socket.recv(message_length - received_length)
        if not chunk:
            break
        fragments.append(chunk)
        received_length += len(chunk)

相关问题 更多 >