前言:下面的代码是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
目前没有回答
相关问题 更多 >
编程相关推荐