我有一个python服务器,可从客户端连续接收图像。 对于每个图像,我需要将其保存到磁盘,并使用图像路径和每个图像的整数值创建一个csv。 我的问题是,当图像保存到磁盘时,我重置了字节数组。所以只有图像的顶部可见,因为在PC仍保存图像时清除了数组。 我怎么知道什么时候完全保存了文件?
conn, addr = s.accept()
print('Connect with ' + addr[0] + ':' + str(addr[1]))
data = b''
while True:
buf = conn.recv(4096)
data = data + buf
if len(buf) < 4096:
date_string = str(datetime.datetime.now().timestamp()).replace('.', '')
with open('./images/' + date_string + '.jpg', 'ab') as f:
f.write(data)
data = b''
conn.send(str.encode("OK\n"))
更新:
我试图更好地解释这种情况:
从一个android设备(客户端),我从相机捕获了连续帧,我需要对其进行后期处理以进行机器学习。 设备捕获的每一帧都将发送到python服务器(上面的代码)。在客户端(智能手机)发送下一帧之前,我必须确保将前一帧保存到磁盘(计算机硬盘)。实际上,“ conn.send(str.encode(“ OK \ n”))行需要对客户端说:“好,我保存了图像,您可以将下一张图像发送给我。”但是在清除数据之前变量,其中包含实际图像,我必须确保f.write()已完成。
答案 0 :(得分:1)
在检查了documentation之后,似乎您不应该检查数据的大小,而应该追加直到不再接收数据为止。
conn, addr = s.accept()
print('Connect with ' + addr[0] + ':' + str(addr[1]))
data = b''
while True:
buf = conn.recv(4096)
if buf:
data = data + buf
conn.send(str.encode("OK\n"))
else:
break
date_string = str(datetime.datetime.now().timestamp()).replace('.', '')
with open('./images/' + date_string + '.jpg', 'ab') as f:
f.write(data)
也许中间有一些包装,它们的大小不一样,但并不是最后的包装。 此外,这还具有其他优点,因为您无需重置数据变量。