前提・実現したいこと
Pythonでソケット通信を行うプログラムを作っています。
ソケットを通じてメッセージを受け取りその内容を表示することを目指しています。
接続先には自PCを指定しています。
至らない点がありましたらご指摘いただけると幸いです。
よろしくお願い致します。
発生している問題・エラーメッセージ
ソケットを通じてメッセージを受け取ろうとしても接続待ちになってしまいます。
コンソールには以下が表示されます。(追記)
my ip address is now ... (IPアドレス) Waiting for the connection ...
プログラムの実行を止めると以下のエラーが表示されます。
KeyboardInterrupt
該当のソースコード
python
1<?python 2#server.py 3from concurrent.futures import ThreadPoolExecutor 4import socket 5import os 6 7 8def __handle_message(args_tuple): 9 10 conn, addr, data_sum = args_tuple 11 while True: 12 data = conn.recv(1024) 13 data_sum = data_sum + data.decode('utf-8') 14 15 if not data: 16 break 17 18 if data_sum != '': 19 print(data_sum) 20 21 22def __get_myip(): 23 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 24 s.connect(('8.8.8.8', 80)) 25 return s.getsockname()[0] 26 27 28def main(): 29 30 # AF_INET : IPv4ベースのアドレス体系を使う 31 # SOCK_STREAM : TCP/IPを使う 32 my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 33 34 # 多重接続になってもいいようにスレッドで処理する 35 executor = ThreadPoolExecutor(max_workers=os.cpu_count()) 36 37 # 開くポート番号は適当に選ぶ 38 myhost = __get_myip() 39 print('my ip address is now ...', myhost) 40 my_socket.bind((myhost, 50030)) 41 42 # 同時に接続する相手の数。今回は1 43 my_socket.listen(1) 44 45 try: 46 while True: 47 48 # 接続があるまで待機 49 print('Waiting for the connection ...') 50 conn, addr = my_socket.accept() 51 print('Connected by ...', addr) 52 data_sum = '' 53 executor(__handle_message, (conn, addr, data_sum)) 54 55 except KeyboardInterrupt: 56 print('done') 57 58 59if __name__ == '__main__': 60 main() 61 62 63#client.py 64import socket 65 66my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 67my_socket.connect(('自PCのIPアドレス', 50030)) 68my_text = "Hello! This is test message from my sample client!" 69my_socket.sendall(my_text.encode('utf-8')) 70 71>
試したこと
デバッグを行うとaccept()で問題になっていることがわかりました。
補足情報(FW/ツールのバージョンなど)
OS:mac
Python:3.7.0
IDE:Pycharm