سؤال

أحاول الحصول على دفق متغير طول من الكاميرا مع بيثون، ولكن الحصول على سلوك غريب. هذا هو 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 بايت. عندما (إذا) أحصل على حلقة الأولى، أحتاج إلى التحقق من هذا الرأس لمعلومات صحة وحجمها. ينتهي البرنامج بخطأ بيانات خاطئ، وملف التفريغ عبارة عن مجموعة من القمامة الثنائية، لذلك ليس لدي أي فكرة عما تلقيته في النهاية. أنا متأكد من أن الجهاز في الجانب الآخر يحاول إرسال البيانات الصحيحة.

هل كانت مفيدة؟

المحلول 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 (Chunk)، و Len (البيانات) عند الخروج من الحلقة، لا يمكن أن تؤذي محاولة فهم ما يحدث. أيضا، ما في dump عند الخروج مع imahe get error رسالة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top