Вопрос

Я пытаюсь получить поток переменной длины с камеры с помощью python, но получаю странное поведение.Это 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 бит" (что случается редко) либо это:

`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-байтовый заголовок.Когда (если) я пройду первый цикл, мне нужно проверить этот заголовок на правильность и информацию о размере.Программа завершается с ошибкой неправильных данных, а файл дампа представляет собой кучу двоичного мусора, поэтому я понятия не имею, что я получил в конце.Я почти уверен, что устройство на другой стороне пытается отправить правильные данные.

Это было полезно?

Решение 2

Проблема решена, интересно, что проблема была вызвана выключением (1), другой стороне не нравятся отключения в стиле http.Есть также очевидные опечатки и пропущенные проверки, но это не в проблема.

Другие советы

Вы на самом деле не знаете, сколько байт вы получили, поскольку ваш код:

data=''
while len(data)<10:
        chunk = tcpCliSock.recv(1024)
        print 'recv\'d %d bites'%len(data)
        data=data+chunk

т.е. вы получаете байты в chunk, но то , что вы печатаете , это len(data) прежде чем вы обновите data.Поэтому, конечно, он будет печатать 0 в первый раз, всегда - затем он будет обновляться data и выйти, если chunk было не менее 10 байт.

Этой информации недостаточно для отладки вашей проблемы, но печать len (фрагмента) и len (данных) после выхода из цикла не может помешать попытке понять, что происходит.Кроме того, что находится в dump когда вы выходите с imahe get error сообщение?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top