pythonですぐ出来る! ファイルを転送する方法【TCP通信 応用】

python サンプル学習
この記事は約6分で読めます。

python でserver/clientのTCP通信のサンプルを生かして

画像やエクセル、テキストファイルの送受信を実施してみてましょう

初心者向けの使い方から応用までを説明致します。

本日の伝えたいこと

 バイナリデータとして扱えば、どんなファイルでもすぐ送信できる

困ったこと

持ち運び用のノートパソコンから、解析用のデスクトップパソコンに

データを移す時に、USBメモリを使えない場合がある

内容

TCP通信を応用として ファイルの送受信をする

メリット

遠隔で即座にデータのやり取りができるようになる

解決方法

下記サイトを参考にさせていただきました!

pythonでsocket通信を勉強しよう - Qiita
学習履歴 ■はじめに python で掲示板アプリを作成したいと思って情報を集めている。 作り方の予想は大方ついたが、掲示板に投稿した際、画面上に投稿内容を リアルタイム表示する方法が現状不明だ。 socket 通信を使えば...

受信側(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通信をするとき、ファイルをバイナリデータとして扱うと送信ができる

タイトルとURLをコピーしました