在Python 3中通过套接字发送图像

时间:2017-08-08 20:14:39

标签: python sockets

我正在尝试通过套接字从客户端向服务器发送图像(屏幕截图)。在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。

1 个答案:

答案 0 :(得分:4)

在检索所有数据之前,.recv()的调用可能会返回;参数是最大尺寸,而不是确切尺寸。您需要在循环中调用.recv()并附加数据,直到收到整个图像。这意味着您需要一些方法来了解收到整个数据的时间 - 通常的策略是:

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