Я пытаюсь получить поток переменной длины с камеры с питоном, но получаю странное поведение. Это Python 2.6.4 (r264: 75706) в Linux (Ubuntu 9.10)
Сообщение должно прийти со статическим заголовком, за которым следуют размер и остальная часть потока. вот код
from socket import *
import array
import select
HOST = '169.254.0.10'
PORT = 10001
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
tcpCliSock.setblocking(0)
def dump(x):
dfile = open('dump','w')
dfile.write(x)
dfile.close
data='I'
tcpCliSock.send(data)
tcpCliSock.shutdown(1)
ready_to_read, ready_to_write, in_error = select.select(
[tcpCliSock],
[],
[],
30)
if ready_to_read == []:
print "sokadens"
data=''
while len(data)<10:
chunk = tcpCliSock.recv(1024)
print 'recv\'d %d bites'%len(data)
data=data+chunk
index=data.find('##IMJ')
if index == -1:
dump(data)
raise RuntimeError, "imahe get error"
datarr = array.array('B',data)
size=datarr[6]+datarr[7]<<8+datarr[8]<<16+datarr[9]<<24
ready_to_read, ready_to_write, in_error = select.select(
[tcpCliSock],
[],
[],
30)
if ready_to_read == []:
print "sokadens"
while len(data)<size:
chunk = tcpCliSock.recv(1024)
data=data+chunk
outfile=open('resim.jpg','w')
outfile.write(data[10:])
outfile.close
tcpCliSock.close()
с этим кодом я либо застреваю в цикле "recv \ 'd 0 bites" (что случается редко)
или это:
`recv'd 0 bites`
Traceback (most recent call last):
File "client.py", line 44, in <module>
raise RuntimeError, "imahe get error"
RuntimeError: imahe get error
, что совершенно странно (получить 0 байтов, но выйти из цикла). Сброшенные данные ошибочны, что ожидается в этой ситуации
Редактировать 1: устройство должно отправлять изображение JPEG, которому предшествует 10-байтовый заголовок. Когда (если) я прошёл первый цикл, мне нужно проверить этот заголовок на правильность и размер информации. Программа завершается с ошибкой неверных данных, а файл дампа представляет собой кучу бинарного мусора, поэтому я не представляю, что я получил в конце. Я уверен, что устройство на другой стороне пытается отправить правильные данные.