2017-08-08 168 views
1

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

CLIENT

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。

回答

3

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

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

非常感谢!我看过很多次,我一直在想,为什么人们这样做。再一次,谢谢你帮助我! – chrizator