【问题标题】:Python socket not receiving anythingPython套接字没有收到任何东西
【发布时间】:2017-08-29 01:34:52
【问题描述】:

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

【问题讨论】:

  • 接受你自己的答案然后:)
  • 它说我必须再等 7 个小时才能接受它。

标签: python sockets nonblocking


【解决方案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) 不会影响了解正在发生的事情的尝试。另外,当您使用imahe get error 消息退出时,dump 中的内容是什么?

【讨论】:

  • 查看edit1,在我目前的状态下,转储对我来说毫无用处。我将尝试编写一个虚拟服务器。
【解决方案2】:

问题已解决,有趣的是,shutdown(1) 导致了问题,对方不喜欢 http 风格的关闭。也有明显的拼写错误和遗漏的检查,但它们不是问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多