【问题标题】:Python socket sendall randomly failsPython socket sendall 随机失败
【发布时间】:2014-04-29 16:52:43
【问题描述】:

我有一个简单的脚本,可以将图像文件从一台机器传输到另一台机器, 进行图像处理并将结果作为“骰子计数”返回。 问题是随机接收到的图像部分是灰色的。好像没有 关于何时传输不完整的原因,我在代码中没有看到其他问题。 客户端没有给出任何错误或任何指示 sendall 失败或不完整的指示。 谢谢大家。

服务器代码:

def reciveImage():
    #create local buffer file 
    fo = open("C:/foo.jpg", "wb")
    print "inside reciveImage"
    while True:
        print "inside loop"
        data = client.recv(4096)
        print "data length: ", len(data)
        fo.write(data)
        print "data written"
        if (len(data) < 4096):
            break
            print "break"       
    fo.close()
    print "Image received"

以及(简化的)客户端代码:

data = open("/home/nao/recordings/cameras/image1.jpg", "rb")    
        # prepare to send data
        binary_data = data.read()
        data.close()

        sock.sendall(binary_data)

正常服务器输出:

Client Command: findBlob. Requesting image...
inside reciveImage
inside loop
data length:  4096
data written
#... This happens a bunch of times....
inside loop
data length:  4096
data written
inside loop
data length:  1861
data written
Image received
dice count:  0
Waiting for a connection

但随机它只会循环几次或更少,例如:

Client Command: findBlob. Requesting image...
inside reciveImage
inside loop
data length:  1448
data written
Image received
dice count:  0
Waiting for a connection

【问题讨论】:

    标签: tcp jpeg transfer


    【解决方案1】:

    recv 在接收到所有数据之前不会阻塞,它只会阻塞直到接收到一些数据并返回它们。例如。如果客户端发送前 512 个字节,然后再发送另一个 512 字节,即使您要求 4096,您的 recv 也会返回前 512 个字节。因此,只有在 recv 返回时才应中断,即没有更多数据可用(连接关闭) .

    【讨论】:

    • 这就是为什么我做“if (len(data)
    • 你应该检查len(data)==0,例如没有新数据到达
    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2017-02-07
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多