質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1219閲覧

pythonでバイナリが書き込めない

besides-poit

総合スコア23

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/18 13:10

pythonのsocketでクライアントがスクリーンショットを取りバイナリをとりsocketでそのバイナリを送りサーバーがバイナリを受取、ファイルに書き込み保存するプログラムなのですが、保存されません。

python3

1#サーバー 2# socket サーバを作成 3 4import socket 5 6# AF = IPv4 という意味 7# TCP/IP の場合は、SOCK_STREAM を使う 8with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 9 s.bind(('127.0.0.1', 50007)) 10 s.listen(1) 11 # connection するまで待つ 12 while True: 13 conn, addr = s.accept() 14 with conn: 15 while True: 16 # データを受け取る 17 data = conn.recv(8000) 18 with open('./moka.png',mode='wb') as wb: 19            #moka.pngはあらかじめつくってあります 20 binary = data 21 wb.write(binary) 22 if not data: 23 break

python3

1#クライアント 2import pyautogui 3import socket 4 5num = 0 6while True: 7 s = pyautogui.screenshot() 8 s.save("pict.png") 9 print(num) 10 num = num + 1 11 with open("./pict.png",mode='rb') as bin: 12 binary = bin.read() 13 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 14 # サーバを指定 15 s.connect(('127.0.0.1', 50007)) 16 print(binary) 17 s.sendall(binary) 18 print("送信")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/05/18 14:05

実行した際の状況を書いてください。
guest

回答2

0

データをrecvするたんびにファイルをopenしてますが、これではファイルは新規作成されてしまいます

投稿2020/05/18 13:15

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

besides-poit

2020/05/18 13:18

他にファイルは新規作成されていないです...
y_waiwai

2020/05/18 13:20

'./moka.png'という名前のファイルが、新規作成されます。それ以前に書き込まれたデータはクリアされますね
besides-poit

2020/05/18 13:24

moka.pngというファイルはあらかじめつくってあります
y_waiwai

2020/05/18 13:46

だから、openしたらその都度クリアされます
guest

0

ベストアンサー

問題点 サーバー側

python

1 # データを受け取る 2 data = conn.recv(8000) 3 with open('./moka.png',mode='wb') as wb: 4            #moka.pngはあらかじめつくってあります 5 binary = data 6 wb.write(binary) 7 if not data: 8 break
  • #moka.pngはあらかじめつくってあります の行のインデント
  • conn.recv(8000) -> 画像ファイルのサイズは 8000 バイト (単位に注意) より小さい?

  読み出しのバッファサイズを意図してのサイズでしょうか?

  • data が空の時、moka.png を空データで上書きします

  受信したデータが意図したものになっているか表示して確認して見て下さい。

以上3点の対処で、サーバー側でのファイルの保存を確認出来ました。(win10/py3.8)

ちなみに、recv() では状況によってはデータの取りこぼしが発生することがあります。
今回のケース、ローカル上での実行なら顕在しませんが。(今回の問題の原因ではありません)

recv(bufsize) は、最大サイズで、読み出しが保証されるわけではありません。
通常は何バイト読み込んだか確認してバッファリングが必要になります。
具体的には、socket.makefile() を使い、ファイルと同じように read() で読み出したりします。

python

1# 要: import shutil (標準ライブラリ) 2 3conn, addr = s.accept() 4with conn, conn.makefile("rb") as rb, open("./moka.png", mode="wb") as wb: 5 shutil.copyfileobj(rb, wb)

より効率良くデータを読みだそうとするなら、接続を維持したままにして、
最初にこれから送るバイナリーデータのデータサイズを送信するとよいです。
正常に受信できたかどうかの確認ができます。

投稿2020/05/18 15:01

編集2020/05/18 15:02
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問