2017-08-08 22 views
1

ソケット(画像)をクライアントからサーバーに送信しようとしています。 Python 2では、バイナリデータとStringIOを読み書きするためにread()write()関数を使用することができました。しかし、それらはすべて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()に電話し、画像全体が受信されるまでデータを追加する必要があります。

  • あなたには、いくつかの特定の終端文字または文字列が表示されるまで読んでください:このための一般的な戦略がある - これは、あなたが全体のデータを受信したときに知っているいくつかの方法が必要になりますことを意味しています。生の画像データには、誤って特定のバイト列が含まれている可能性があるため、この場合は直接適用できません。
  • データの前に長さ(ターミネータ付きの10進数または固定長のバイナリ値)を送信します。あなたがその多くのバイトを受け取るまで読書を続けてください。
  • データを送信した後にソケットを閉じます。ゼロバイトの結果が得られるまで読書を続けてください。
+0

ありがとうございました!私は何度もそれを見て、私はいつも不思議に思っていました。なぜ人々がそれをやっているのですか?もう一度、私を助けてくれてありがとう! – chrizator

関連する問題