python でserver/clientのTCP通信のサンプルを生かして
画像やエクセル、テキストファイルの送受信を実施してみてましょう
初心者向けの使い方から応用までを説明致します。
本日の伝えたいこと
✔ バイナリデータとして扱えば、どんなファイルでもすぐ送信できる
困ったこと
持ち運び用のノートパソコンから、解析用のデスクトップパソコンに
データを移す時に、USBメモリを使えない場合がある
内容
TCP通信を応用として ファイルの送受信をする
メリット
遠隔で即座にデータのやり取りができるようになる
解決方法
下記サイトを参考にさせていただきました!

受信側(Server)の使い方
受信側で、現在時刻でファイル名を付ける
受信したファイルを保存するために現在時刻を利用して名前を付ける
datetime.nowで現在時刻を取得し、strftimeを使用することで好みの形式の
string型にすることができる
import datetime
dt_now = datetime.datetime.now()
fname = dt_now.strftime(‘%Y%m%d%H%M%S’) + “_received.” + “csv”
バイナリモードでファイルを開いて待機する
下記赤字部分が今回の肝になる。
ファイル受信待機中は、appendモードかつ、バイナリモードで待つ
with open(fname, mode=”ab”) as f:
while True:
data = conn.recv(1024)
if not data:
break
f.write(data)
conn.sendall(b’Received done’)
exit()
送信側(Client)の使い方
バイナリモードでファイルを開いて送信する
送信側もファイルをバイナリデータとして開くことが大切だ。
テキストデータであったとしても、エクセルのようなバイナリデータであったとしても
問題なく送信ができるようになる
with open(fname, mode=’rb’) as f:
for line in f:
s.sendall(line)
サンプルコード
では例として、パワーポイントファイルの送信をしてみる
Server側では、下記コマンドを打ってみよう。
第一引数から、[server or client] [IPaddress] [port] [受信データの拡張子]
>> python connection.py s 127.0.0.1 50001 pptx
Client側では、下記コマンドを打ってみよう。
第一引数から、[server or client] [IPaddress] [port] [送信ファイルのパス]
>> python connection.py c 127.0.0.1 50001 test.pptx
# -*- coding: utf-8 -*-
import socket
import datetime
import sys
def server(ip, port, ext):
output_list = []
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((ip, port))
s.listen(1)
while True:
conn, addr = s.accept()
with conn:
dt_now = datetime.datetime.now()
fname = dt_now.strftime('%Y%m%d%H%M%S') + "_received." + ext
with open(fname, mode="ab") as f:
while True:
data = conn.recv(1024)
if not data:
break
f.write(data)
conn.sendall(b'Received done')
exit()
def client(ip, port, fname):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((ip, port))
try:
with open(fname, mode='rb') as f:
for line in f:
s.sendall(line)
data = s.recv(1024)
print(repr(data.decode()))
except:
pass
if __name__ == "__main__":
if (sys.argv[1] == "s"):
server((sys.argv[2]), int(sys.argv[3]), sys.argv[4])
if (sys.argv[1] == "c"):
client((sys.argv[2]), int(sys.argv[3]), sys.argv[4])
受信したパワーポイントの中身が開けることの確認


実際の現場で求められること
通信を使ったファイル転送は、Bluetoothなどもあり正直使う機会は滅多にないと思う。
ただし、wifiを使ったデータ通信は屋外テストなどでとても役に立つ。
解析部隊に随時ファイルを転送するなどだ
知識として役に立つ場面が必ず出てくるので押さえておいてほしい
まとめ
✔ TCP/IP通信をするとき、ファイルをバイナリデータとして扱うと送信ができる