Python socket没有收到任何东西

时间:2009-11-10 18:18:14

标签: python sockets nonblocking

我正在尝试从带有python的摄像头接收可变长度的流,但是会产生奇怪的行为。这是Linux上的Python 2.6.4(r264:75706)(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字节的标题。当(if)我越过第一个循环时,我需要检查此标题的正确性和大小信息。程序以错误的数据错误终止,转储文件是一堆二进制垃圾,所以我不知道我最后收到了什么。我很确定另一方的设备正在尝试发送正确的数据。

2 个答案:

答案 0 :(得分:1)

您实际上并不知道收到了多少字节,因为您的代码是:

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中的内容是什么?

答案 1 :(得分:0)

问题解决了,有趣的是shutdown(1)导致了问题,另一方不喜欢http风格的关机。还有明显的错别字和缺少检查,但它们不是 问题。