使い方
・コマンドラインで、「python server.py 0 6000」と、0 = ループ開始位置 6000 = ループ終了位置
・もう一つのコマンドプロンプトで、「client.py」を叩く。
作成意図
・連続でソケット通信をしていると、エラーが起きると言われ、その改善の為に作成。
ソースコード
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))