将任意POST数据写入固定大小的套接字

2024-06-10 11:40:28 发布

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

前言:下面的代码是micropython,在微控制器上工作,问题本身,我猜,与平台无关,与sockets如何工作有关,这我真的很新

在一个应用程序中,我使用一个套接字将数据从i2c eeprom发送到服务器

import usocket

buf = bytearray(64)
#...
socket = usocket.socket(*addrinfo[:3])
socket.connect(addrinfo[-1])
#...
socket.write('{0} /{1} HTTP/1.0\r\n'.format(method, path))
socket.write('Host: {0}\r\n'.format(host))
socket.write(b'Content-Length: {0}\r\n'.format(eeprom.payload_size))
socket.write('\r\n')
#... fill buf with eeprom data...
socket.write(buf)

这适用于少量数据

问题是数据可能超过64字节——eeprom是8KB,理论上我可能需要发送thm all——我想把所有数据写入同一个套接字,反复重复使用同一个缓冲区

我试过用迭代器,只发送第一个缓冲区,下面的socket.write都丢失了

def ipayload(self, buf):
    size = len(buf)
    for memaddr in range(self.__head_pointer, self.__tail_pointer, size):
        self.read_into(memaddr, buf)
        yield min(self.__tail_pointer - memaddr, size)

#...
for c in eeprom.ipayload(buf):
    socket.write(buf)

服务器端我使用PHP并读取整个输入流(我猜):

$content_lenght = $_SERVER['CONTENT_LENGTH'];
$input = fopen('php://input', 'rb');
while (!feof($input) && $data = fread($input, 8)){
    $content_lenght -= 8
    //use data
}

另外,对$_SERVER['CONTENT_LENGTH']$content_lenght的检查显示,我总是得到64个字节,所以只有第一个缓冲区

我该怎么办?目前,每次我从eeprom读取数据时,python都会为一个新的bytestring分配内存,这样就有可能溢出内存,以防发送的数据达到4Kb


Tags: 数据selfformatinputdatasizesocketcontent