Python套接字没有收到任何东西
我试图从python相机接收一个可变长度的流,但得到奇怪的行为。这是Linux上的Python 2.6.4(r264:75706)(Ubuntu 9.10)Python套接字没有收到任何东西
该消息应该带有一个静态头,后面跟着大小和流的其余部分。这里是代码
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 \倒是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字节的标题。当(如果)通过第一个循环时,我需要检查此标题的正确性和大小信息。程序以错误的数据错误终止,转储文件是一堆二进制垃圾,所以我不知道最后收到了什么。我很确定对方的设备正在尝试发送正确的数据。
问题解决了,有趣的是shutdown(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
消息时是什么?
请参阅edit1,在我目前的状态下,转储对我来说是无用的。我会尝试写一个虚拟服务器。 – 2009-11-10 21:21:28
接受你自己的答案然后:) – 2009-11-11 20:05:06
它说我必须等待7个小时才能接受它。 – 2009-11-12 10:31:47