LoginSignup
0
0

More than 1 year has passed since last update.

Python 連続ソケット通信(コマンド引数 分ループを回し、csvファイル出力)

Last updated at Posted at 2023-01-31

使い方

・コマンドラインで、「python server.py 0 6000」と、0 = ループ開始位置 6000 = ループ終了位置

・もう一つのコマンドプロンプトで、「client.py」を叩く。
スクリーンショット (617).png

作成意図

・連続でソケット通信をしていると、エラーが起きると言われ、その改善の為に作成。

ソースコード

server.py

python server.py

import socket                                          # socketライブラリをインポート
import datetime
import pickle
import sys


class Date_To():
    # ============ 日時・時刻 クラス ============
    # 予約時間 格納用
    def __init__(self):
        self.time_num = [
            ['1', '9:00'],
            ['2', '10:00'],
            ['3', '11:00'],
            ['4', '12:00'],
            ['5', '13:00'],
            ['6', '14:00'],
            ['7', '15:00']
        ]

        self.dt_now = ""

    # === 当日取得 ::: 2022-11-04 14:26:56.878021
    def Now_date(self):
        self.dt_now = datetime.datetime.now()
        return self.dt_now

    # === 日付 ::: フォーマット 22-11-04
    def Date_cut(self, t_date):
        now_date = t_date
        n_now_date = now_date.strftime("%y-%m-%d")
        return n_now_date

    # === index に応じた time_num の時間を出力
    def Yoyaku_Time_idx(self, idx, idx_02):
        return self.time_num[idx][idx_02]

    def Date_Add(self, num):
        date_add = self.dt_now + datetime.timedelta(days=num)
        return date_add
        # Date_To ****** END ********


# 日付け オブジェクト
Date_Obj = Date_To()
now_date = Date_Obj.Now_date()  # 日付け

# data = {1: "Apple", 2: "Orange"}

# ============= コマンドライン引数を使って、ファイル番号と、ループ END の設定
args = sys.argv
if(args[1] == 0):
    OUT_NUM = 1
    END_NUM = 5000
else:
    OUT_NUM = int(args[1])
    END_NUM = int(args[2])


# =========================== ソケット 部分
HOST = '127.0.0.1'                                     # ServerのIPアドレスを指定
PORT = 65432                                           # Serverのポート番号を指定
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # socket(IP, TCP)を作成
# socketに指定したIPアドレスとポート番号を適用
s.bind((HOST, PORT))
s.listen(100)                                             # socketをlisten状態にする
# conn, addr = s.accept()                                # socket通信を受け入れ

LOOP_FLG = True

if LOOP_FLG == True:
    while True:
        conn, addr = s.accept()

        # msg = pickle.dumps(data)  # 辞書データ
        # conn.send(msg)

        conn.sendall((str(now_date) + '*' + str(OUT_NUM)).encode()
                     )                 # メッセージ(バイト列)を送信
        OUT_NUM += 1

        if (OUT_NUM >= END_NUM):

            s.close()
            break

else:
    s.close()

client.py

python client.py
import socket                                           # socketライブラリをインポート
import pickle
from tkinter import EXCEPTION
import csv
import pprint
import os

from exceptiongroup import catch


HOST = '127.0.0.1'                                      # ServerのIPアドレスを指定
PORT = 65432                                            # Serverのポート番号を指定
# s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   # socket(IP, TCP)を作成
# s.connect((HOST, PORT))                                 # Serverにアクセス

FIEL_PATH = r'D:\\外山工業\\python 問い合わせ 2023\\file\\'


def Check_Dir(path):
    # === path の場所に ディレクトリ作成
    d_path = path

    try:
        if(os.path.isdir(d_path)):  # フォルダが存在していた場合
            pass
        else:
            os.makedirs(d_path)
    except FileExistsError:
        print('関数名:Check_Dir ::: ディレクトリ作成エラー')


Check_Dir(FIEL_PATH)

# ================================= ソケット通信実行
try:
    while True:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((HOST, PORT))
        data = s.recv(4096)                                  # メッセージを受け取る

        if not data:
            print('データがありません')
            break
        else:
            data = data.decode("utf-8")
            data_split = data.split('*')
        #  with open(FIEL_PARH + '')
            print("============" + "\n")
            print("01:" + data_split[0])
            print("02:" + data_split[1] + "\n")
            print("============")

            # === ファイル用に文字列編集
            file_name1 = data_split[0]
            file_name2 = data_split[0]

            file_name_02 = file_name2[11:].replace('.', '_')
            file_name_03 = file_name_02.replace(':', '')

            file_name = file_name1[0:10] + '_' + file_name_03

            with open(FIEL_PATH + file_name + '.csv', 'a') as f:
                writer = csv.writer(f)
                writer.writerow([file_name1[0:10] + ',' + file_name2[11:18] + ','
                                 + data_split[1]])


# except (ZeroDivisionError, TypeError) as e:
#    print(e)
except EXCEPTION as e:
    print('=== 例外発生===' + "\n")
    print('=== エラー内容 ===')
    print('type:' + str(type(e)))
    print('args:' + str(e.args))
    print('message:' + e.message)
    print('e自身:' + str(e))


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0