前提
現在サーバー側Windows搭載のPC
クライアント側ラズパイ4が3台
このような構成になっています
実現したいこと
実現したことしては
- サーバで値を入力する。
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 コメント