代码之家  ›  专栏  ›  技术社区  ›  Atilla Filiz

python套接字未接收到任何内容

  •  0
  • Atilla Filiz  · 技术社区  · 15 年前

    我试图从一个使用python的相机接收一个可变长度的流,但得到了奇怪的行为。这是Linux(Ubuntu 9.10)上的python 2.6.4(r264:75706)

    消息应该带有静态头,后跟大小和流的其余部分。这是密码

    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 bits”循环(这种情况很少发生) 或者:

    `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 回复  |  直到 7 年前
        1
  •  1
  •   Alex Martelli    15 年前

    由于您的代码是:

    data=''
    while len(data)<10:
            chunk = tcpCliSock.recv(1024)
            print 'recv\'d %d bites'%len(data)
            data=data+chunk
    

    也就是说,您接收的字节 chunk 但是你要打印的是 len(data) 在更新之前 data .所以当然,它会第一次打印0,总是——然后它会更新 数据 退出,如果 至少10个字节。

    这个信息不足以调试您的问题,但是在退出循环时打印len(chunk)和len(data)不会影响理解发生了什么事情的尝试。此外,什么是在 dump 当你退出时 imahe get error 消息?

        2
  •  0
  •   Atilla Filiz    15 年前

    问题解决后,有趣的是关机(1)引起了问题,另一方不喜欢HTTP样式的关机。也有明显的打字错误和漏掉的支票,但它们不是 这个 问题。