python - 将任意 POST 数据写入具有固定大小缓冲区的套接字
问题描述
前言:下面的代码是 micropython 并且在微控制器上工作,我想问题本身是平台独立的并且与套接字的工作方式有关,我真的很新。
在一个应用程序中,我使用套接字将数据从 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 是 8kbytes,理论上我可能需要全部发送——我想将所有数据写入同一个套接字,一遍又一遍地重用同一个缓冲区。
我尝试使用迭代器,只发送第一个缓冲区,后面的 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 为一个新的字节串分配内存,如果要发送完整的 4Kb,我就有溢出的风险。