【问题标题】:Sending images over socket in Python 3在 Python 3 中通过套接字发送图像
【发布时间】:2017-08-09 04:35:41
【问题描述】:

我正在尝试通过套接字将图像(屏幕截图)从客户端发送到服务器。在 Python 2 中,我能够使用 read()write() 函数来读取和写入二进制数据以及 StringIO。但是它们都在 Python 3 中消失了。我在玩 PIL,但我无法让测试程序运行。

客户

image = ImageGrab.grab()
s.send(image.tobytes())

我使用GrabImage 创建了一个屏幕截图并将其保存为image。之后,我通过套接字将图像作为二进制文件发送到服务器。

服务器

data = conn.recv(4194304)
img = Image.frombytes('RGB', (1366, 768), data)
img.save('screenshot.jpg')

但是,如果我运行脚本,我会收到一条错误消息:
ValueError: not enough image data

我想我错过了一些决定性的东西,但我想不通。
谢谢你,chrizator。

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    .recv() 的调用很可能在检索到所有数据之前返回;该参数是最大尺寸,而不是精确尺寸。您需要循环调用.recv() 并附加数据,直到收到整个图像。这意味着您需要通过某种方式来了解何时收到全部数据 - 常见的策略是:

    • 继续阅读,直到您看到某个特定的终止字符或字符序列。在这种情况下不直接适用,因为原始图像数据可能会意外包含任何特定的字节序列。
    • 在数据之前发送长度(可能是带终止符的十进制数,或固定大小的二进制值);继续阅读,直到收到这么多字节。
    • 发送数据后关闭socket;继续阅读,直到你得到一个零字节的结果。

    【讨论】:

    • 非常感谢!我看到很多次,我一直在想,为什么人们会这样做。再次感谢您帮助我!
    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 2019-08-12
    • 2013-03-24
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多