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

### 使い方

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

・もう一つのコマンドプロンプトで、「client.py」を叩く。
![スクリーンショット (617).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478380/68a89745-5c80-0558-2249-2e6b7a49c197.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))


```