y_m_j3w
2024年7月29日 16時36分
お世話になっております。
水野です。
現在、Armadillo側でサーバースクリプトを起動し、PC側でクライアントスクリプトを実行するTCP通信プログラムを開発しています。しかし、サーバーのポートがリッスン状態になり、クライアントも指定したIPアドレスに接続されているにもかかわらず(pingでの確認済み)、メッセージのやり取りができていません。以下にサーバーとクライアントのコードを記載しますので、問題の原因についてご助言いただけると幸いです。
サーバースクリプト:
import socket from datetime import datetime, timezone, timedelta import os def log_message(message): """Log a message to temp.txt and print to console""" log_path = 'temp.txt' # ログファイルのパスを指定 add_header = not os.path.exists(log_path) try: with open(log_path, 'a') as f: if add_header: f.write("time,message\n") jst = timezone(timedelta(hours=+9), 'JST') current_time = datetime.now(jst).strftime('%Y-%m-%d %H:%M:%S') log_entry = f"{current_time},{message}\n" f.write(log_entry) print(log_entry.strip()) # 標準出力に表示 except Exception as e: print(f"Error writing to {log_path}: {e}") def start_server(host='0.0.0.0', port=58080): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: server_socket.bind((host, port)) server_socket.listen(1) log_message(f"Server listening on {host}:{port}") while True: try: log_message("Waiting for a connection...") client_socket, addr = server_socket.accept() log_message(f"Connection from {addr}") while True: data = client_socket.recv(1024) if not data: log_message("No data received, closing connection.") break message = data.decode() log_message(f"Received from client: {message}") response = f"Echo: {message}" log_message(f"Sending response to client: {response}") client_socket.send(response.encode()) except Exception as e: log_message(f"Error handling client: {e}") finally: client_socket.close() log_message(f"Connection with client closed") except Exception as e: log_message(f"Server error: {e}") finally: server_socket.close() if __name__ == '__main__': start_server()
クライアントスクリプト:
import socket def start_client(server_ip, server_port=58080): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((server_ip, server_port)) print(f"Connected to server at {server_ip}:{server_port}") client_socket.settimeout(5.0) # タイムアウトを設定 try: while True: message = input("Enter message to send (type 'exit' to quit): ") if message.lower() == 'exit': break client_socket.send(message.encode()) print("Message sent successfully") # 送信完了メッセージを表示 try: response = client_socket.recv(1024) print(f"Received from server: {response.decode()}") except socket.timeout: print("No response from server, timed out.") finally: client_socket.close() print("Connection closed") if __name__ == "__main__": server_ip = 'XXX.XXX.XXX.XXX' # サーバーのIPアドレスを指定 start_client(server_ip)
現象:
・Armadillo側でサーバーを起動し、PC側のクライアントから接続は確立されています。
・サーバーとクライアント間でメッセージの送受信ができていません。
・クライアント側ではConnected to server at XXX.XXX.XXX.XXX:58080 Enter message to send (type 'exit' to quit): jjj Message sent successfullyと表示されています。
・サーバー側のログにはメッセージがServer listening on 0.0.0.0:58080 2024-07-29 11:38:05,Waiting for a connection...と表示されていますが、メッセージの受信部分で停止しているようです。
質問事項:
1.このコードにおけるメッセージ送受信の問題点についてご指摘いただけますか?
2.接続は確立されているにもかかわらず、メッセージが送受信できない原因として考えられる点は何でしょうか?
3.デバッグするための具体的な手順や注意点があれば教えてください。
お手数をおかけしますが、よろしくお願いいたします。
以上、どうぞよろしくお願いいたします。
コメント
y_m_j3w
> 佐藤です。
>
> コンテナで動かしていると思いますが、コンテナのconfファイルの内容を見せてもらっても良いでしょうか。
> ポート番号を58080にしていますが、この番号はabos-webで使用しているため他の番号にしたほうが良いかと思います。
佐藤さん
ご返信ありがとうございます。
app.confでよろしいでしょうか?
ファイルにて添付いたします。ご査収願います。
ポート番号についてですが、確かにABOSで使用しているため、変更しようと思いますが推奨のポートなどございますでしょうか?
予約済みポートの有無などございましたら、ご教示願いたいです。
以上、よろしくお願いいたします。
ファイル | ファイルの説明 |
---|---|
app.conf.txt |
at_makoto.sato
y_m_j3w
> 佐藤です。
>
> well-knownポートと58080以外でかつ、
> armadillo上で "cat /etc/services" を実行してみてそこにないポートであればなんでも良いかと思います。
> ポートを決めましたら、app.conf に以下を追加してみてください。(ソースコードもそのポートを使うように修正してください。)
> "add_ports <ポート>:<ポート>"
> 例)
> add_ports 58081:58081
佐藤さん。
ご返信ありがとうございます
水野です。
指摘いただいた箇所を修正し、無事動作を確認いたしました。
ありがとうございました。
以上、今後ともよろしくお願いいたします。
at_makoto.sato
2024年7月29日 17時41分
佐藤です。
コンテナで動かしていると思いますが、コンテナのconfファイルの内容を見せてもらっても良いでしょうか。
ポート番号を58080にしていますが、この番号はabos-webで使用しているため他の番号にしたほうが良いかと思います。