You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将bytes对象分块,通过TCP发送固定长度数据包?

解决Python Socket按固定长度分块发送整数数组的问题

别担心,这个分块操作其实很容易搞定,咱们一步步拆解整个流程,从生成数组到最终分块发送,我给你写清楚每一步的逻辑和代码。

1. 生成整数数组并编码为Bytes

首先得把整数数组转换成可传输的bytes对象——直接转数组肯定不行,咱们用struct模块把每个整数编码成固定长度的字节(比如常用的4字节int32,你也可以根据需求调整)。举个例子:

import struct

# 生成你的整数样本数组(这里用示例数组,替换成你自己的业务数据即可)
sample_array = [10, 20, 30, ...]  # 对应你说的编码后总长度551字节的数组

# 将数组编码为bytes:用小端模式打包每个int为4字节,可换成大端(>i)或其他格式
encoded_array = struct.pack(f'<{len(sample_array)}i', *sample_array)
print(f"编码后总长度: {len(encoded_array)}字节")  # 输出你看到的551字节

2. 实现分块拆分逻辑

接下来把长bytes拆成每40字节一块,最后一块可能不足40字节,用循环切片就能轻松实现:

chunk_size = 40
chunks = []

# 循环按固定长度切片,自动处理最后一块不足的情况
for i in range(0, len(encoded_array), chunk_size):
    chunk = encoded_array[i:i+chunk_size]
    chunks.append(chunk)

# 验证分块数量,和你计算的14块一致
print(f"总块数: {len(chunks)}")

3. 用TCP Socket发送分块

最后把这些分块通过Socket发送出去,记得用sendall()方法,它会确保每个分块完整发送(比send()更可靠):

import socket

def send_chunks(host, port, chunks):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        for idx, chunk in enumerate(chunks):
            print(f"发送第{idx+1}块,长度: {len(chunk)}字节")
            s.sendall(chunk)

# 调用发送(替换成你的服务端地址和端口)
send_chunks('localhost', 12345, chunks)

4. 服务端验证接收(可选)

如果需要确认服务端正确接收所有分块,可以写个简单的服务端代码验证:

import socket

def receive_chunks(port, chunk_size=40):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind(('localhost', port))
        s.listen()
        conn, addr = s.accept()
        with conn:
            print(f"连接来自: {addr}")
            received_data = b''
            while True:
                chunk = conn.recv(chunk_size)
                if not chunk:
                    break
                print(f"收到块,长度: {len(chunk)}字节")
                received_data += chunk
            print(f"接收总长度: {len(received_data)}字节")
            # 解码回整数数组验证一致性
            decoded_array = struct.unpack(f'<{len(received_data)//4}i', received_data)
            print(f"解码后数组长度: {len(decoded_array)}")

# 启动服务端
receive_chunks(12345)

关键注意点

  • 编码和解码的格式必须一致:比如发送用<i(小端int32),接收也要用同样的格式,否则会解码错误。
  • 若你的整数不是4字节,可调整struct格式符:比如H是2字节无符号短整型,Q是8字节无符号长整型,按需选择。
  • 分块时不用手动计算总块数,循环切片会自动处理最后一块不足的情况。

内容的提问来源于stack exchange,提问作者Stan Reduta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:17:11