2017-08-08 171 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