初質問です pythonでのsocket通信でクライアントを同時に処理開始させたい

前提

現在サーバー側Windows搭載のPC
クライアント側ラズパイ4が3台
このような構成になっています

実現したいこと

実現したことしては

  1. サーバで値を入力する。

2)3台のクライアントに同じ値を同時に送信
3) 3台のクライアントで処理を実施。
4) すべての結果を収集。
5) 1に戻る

最終的には、PC(サーバー)からの指令が来るたびにラズパイ(クライアント)が同時にプログラムを実行し
実行結果をサーバに返したいです

発生している問題・エラーメッセージ

エラーメッセージ

現在のプログラムだと一度通信を切らないと、サーバー側の数字が更新できない
whileループの中に入れると、複数台同時に送信できない、あるいは
Bad adressといったエラーがでる

該当のソースコード

サーバー側

python

import socket import threading import time IPADDR = ""PORT =sock_sv = socket.socket(socket.AF_INET)sock_sv.bind((IPADDR, PORT))sock_sv.listen(3)signal=input(">>") def recv_client(sock, addr): while True: try: sock.send(signal.encode("utf-8")) data = sock.recv(1024) time.sleep(2) print(data ) except ConnectionResetError: break sock.shutdown(socket.SHUT_RDWR) sock.close() while True: sock_cl, addr = sock_sv.accept() thread = threading.Thread(target=recv_client, args=(sock_cl, addr)) thread.start()

クライアント側

python

import socket import queue import threading import numpy as np import time IPADDR = ""PORT =sock =socket.socket(socket.AF_INET)sock.connect((IPADDR,PORT))signal=0q= queue.Queue() def recv_data(sock): while True: try: signal_data = sock.recv(1024) print(signal_data.decode("utf-8")) q.put(signal_data) except ConnectionResetError: break sock.shutdown(socket.SHUT_RDWR) sock.close() thread = threading.Thread(target=recv_data, args=(sock,))thread.start() while True: signal=q.get() signal=float(signal) try: if signal > 0: ser = serial.Serial("/dev/ttyS0", 38400,bytesize=7) msg =ser.readline() msg = msg.decode() tok = msg.split(',') S_data=tok[1]+","+tok[2]+","+tok[4] S_data=str(S_data) sock.send(S_data.encode("utf-8")) else: data=("error") sock.send(data.encode("utf-8"))  except ConnectionResetError:  break sock.shutdown(socket.SHUT_RDWR)sock.close()

試したこと

ループ外にinputを設けるとエラーは起きないが、数字が更新できない
thread.start()の上にinputを設けると個々に数字を送るので同時に実行できない

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

コメントを投稿

0 コメント