【问题标题】:Can't send large length object over Sockets with python无法使用 python 通过套接字发送大长度对象
【发布时间】:2021-08-15 14:53:43
【问题描述】:

我使用覆盆子作为客户端,我正在向远程 linux 服务器发送一个大数组,问题是当我尝试发送一条小消息时,消息被发送,但是当我发送数组时一个 65xxx 字节的长度,服务器什么也没收到。顺便说一下,数组是腌制的。

server.py:

try:

    # 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)
    received_len = 0
    while received_len < message_length:


        chunk = client_socket.recv(message_length - received_len)
        if not chunk:
            break
        fragments.append(chunk)
        received_len += len(chunk)

    data_arr = b"".join(fragments)


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

client.py:

message = pickle.dumps(faceBlob)

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

【问题讨论】:

标签: python sockets server


【解决方案1】:

我不会听话的。前面预留8位,这样你的数据包就变成这样了

([xxxx xxxx]   [xxxx ...])
([Packet size] [Data])

然后先用recv(8)接收前8位,再用recv(p_len) p_len -> 数据包长度

(也可以预留16位等)

【讨论】:

  • 我知道我应该将消息头更改为 [len(message)] 然后发送它.. 但是我如何编写代码来接收一些东西,然后是其他东西,同时我把它作为一个整个味精
  • 我会采用 IO 流。然后数据实际上可以无限长,您可以随时发送可以再次接收的片段(如果我理解正确的话)docs.python.org/3/library/io.html
猜你喜欢
  • 2022-01-15
  • 2012-03-13
  • 1970-01-01
  • 2012-09-15
  • 2019-04-21
  • 2014-01-11
  • 2021-01-11
  • 2013-01-23
相关资源
最近更新 更多