مقبس بيثون لا يتلقى أي شيء
-
19-09-2019 - |
سؤال
أحاول الحصول على دفق متغير طول من الكاميرا مع بيثون، ولكن الحصول على سلوك غريب. هذا هو 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
رسالة؟