Python套接字未接收到任何数据
我正在尝试用Python从相机接收一个可变长度的数据流,但遇到了一些奇怪的情况。我的Python版本是2.6.4,运行在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()
使用这段代码时,我要么陷入一个“接收到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
你其实不知道你收到了多少字节,因为你的代码是:
data=''
while len(data)<10:
chunk = tcpCliSock.recv(1024)
print 'recv\'d %d bites'%len(data)
data=data+chunk
也就是说,你是在接收字节到chunk
里,但你打印的是在更新data
之前的len(data)
。所以第一次打印的时候,当然总是会显示0——然后它会更新data
,如果chunk
的字节数至少是10的话,就会退出。
这些信息不足以帮助你解决问题,但在退出循环时打印len(chunk)
和len(data)
,可以帮助你更好地理解发生了什么。另外,当你看到image get error
这个错误信息时,dump
里有什么内容呢?
0
问题已经解决了,挺有意思的是,shutdown(1) 这个东西引起了问题,另一边不喜欢用 HTTP 风格的关闭方式。还有一些明显的拼写错误和缺少检查的地方,但这些并不是主要问题。