前提
プログラミング初心者です
初質問です
pythonでのsocket通信に関する質問です
実現したいこと
現在
サーバー側Windows搭載のPC
クライアント側ラズパイ4が三台
このような構成になっており、実現したいことしては
任意の数字(メッセージ)をサーバー側で入力する
サーバーがクライアントに同時にメッセージを送信する
クライアント側がメッセージを受取り処理を開始して、結果をサーバーに送信(三台同時に開始したい)
サーバーでメッセージを受取り、新しく数字を入れなおす
といったシステムをループさせたいです
発生している問題・エラーメッセージ
現在のプログラムだと一度通信を切らないと、サーバー側の数字が更新できない
whileループの中に入れると、複数台同時に送信できない、あるいは
bad adressといったエラーがでる
エラーメッセージ
該当のソースコード
#サーバー側
PADDR =
PORT =
sock_sv = socket.socket(socket.AF_INET)
#sock_sv.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
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()
#######クライアント側#######
import socket
import queue
import threading
import serial
##########ソケット指定#################
IPADDR =
PORT =
sock =socket.socket(socket.AF_INET)
sock.connect((IPADDR,PORT))
##########ソケット#################
signal=0
q= 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:
#########GPS##################
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")) signal=0 else: data=("error") sock.send(data.encode("utf-8")) except ConnectionResetError: break
sock.shutdown(socket.SHUT_RDWR)
sock.close()
pythonここに言語名を入力
ソースコード
### 試したこと ループ外にinputを設けるとエラーは起きないが、数字が更新できない ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
0 コメント