Introduction
嵌入式课程的实验正在加紧写,做的是树莓派小车。写完以后准备写个专辑文章。本文说明的python socket传输文件不完整问题,就是在小车(server)向PC(client)传输图像文件时产生的。记录下问题的发现和解决。
问题发现
在使用python3 socket进行传输图片时,文件不完整,源文件有28KB的大小,但是传输到PC上的数据写到文件里,不足28KB。
猜测
一开始猜测是server发送有问题:
with open('/home/pi/motion/lastsnap.jpg', 'rb')as fin:
r = fin.read(block_size)
while r:
self.request.send(r)
r = fin.read(block_size)
其实最一开始是直接 fin.read() 发送的,我以为是因为一次性发送太多了,所以改成了分块发送。但跟这个发送的数据是没有关系的。
socket传输文件不完整 中说是因为每次发送的数据包大小问题:
每次发送的数据包不要太大!最好是1024byte。我试过,如果是8192,有80%的数据丢了;如果是4096,有50%的数据丢了;如果是512,数据基本得到保证!
据此,我对client的接收代码进行了修改,将接收的块大小进行缩小:
block_size = 2048
file_size = int(s.recv(block_size))
print(file_size)
recv_data_size = 0
data = b''
with open('/home/find/ddown/test.jpg', 'wb') as fout:
while recv_data_size < file_size:
data = s.recv(block_size)<