Python套接字未接收到任何数据

0 投票
2 回答
837 浏览
提问于 2025-04-15 15:52

我正在尝试用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 风格的关闭方式。还有一些明显的拼写错误和缺少检查的地方,但这些并不是主要问题。

撰写回答