【发布时间】:2017-08-29 01:34:52
【问题描述】:
我正在尝试从带有 python 的相机接收可变长度的流,但是得到了奇怪的行为。这是 linux(Ubuntu 9.10) 上的 Python 2.6.4 (r264:75706)
消息应该带有一个静态标题,后跟大小,以及流的其余部分。这是代码
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 字节的标头。当(如果)我通过第一个循环时,我需要检查此标头的正确性和大小信息。程序以错误的数据错误终止,转储文件是一堆二进制垃圾,所以我不知道我最后收到了什么。我很确定另一端的设备正在尝试发送正确的数据。
【问题讨论】:
-
接受你自己的答案然后:)
-
它说我必须再等 7 个小时才能接受它。
标签: python sockets nonblocking