Python套接字没有收到任何东西

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字节的标题。当(如果)通过第一个循环时,我需要检查此标题的正确性和大小信息。程序以错误的数据错误终止,转储文件是一堆二进制垃圾,所以我不知道最后收到了什么。我很确定对方的设备正在尝试发送正确的数据。

+1

接受你自己的答案然后:) – 2009-11-11 20:05:06

+0

它说我必须等待7个小时才能接受它。 – 2009-11-12 10:31:47

问题解决了,有趣的是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消息时是什么?

+0

请参阅edit1,在我目前的状态下,转储对我来说是无用的。我会尝试写一个虚拟服务器。 – 2009-11-10 21:21:28