質問: b_msg.decode('utf-8') print('receive msg:'+ msg) #ソケットにデートを送信 conn.send(b'you sent"' + b_msg + b'"') finally: #接続のクローズ conn.close() finally: #接続のクローズ sock.close() print('end') ``` ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: 原因: サーバー側で、一回受信・返信した後に接続を閉じてます。 処理を追ってみてください。 ``` while True: #clientからの接続を開始 conn, address = sock.accept() try: #recv:ソケットからデータを受信 b_msg = conn.recv(BUFSIZE) #バイトコードが送られてくるのでデコードする msg = b_msg.decode('utf-8') print('receive msg:'+ msg) #ソケットにデートを送信 conn.send(b'you sent"' + b_msg + b'"') finally: #接続のクローズ conn.close() ``` ``` - clientからの接続を開始 - recv:ソケットからデータを受信 - バイトコードが送られてくるのでデコードする - ソケットにデートを送信 - 接続のクローズ <-- 原因 ``` 解決策: close の前に読出~返信のループを組む。 ``` - clientからの接続を開始 (ここを繰り返す) - recv:ソケットからデータを受信 - バイトコードが送られてくるのでデコードする - ソケットにデートを送信 - 接続のクローズ ``` 接続の最大数は10 となっていますが、現在のコードで扱える接続は一つのみです。 同時接続を考える場合は、スレッドを使う等の方法を別途検討してください。 追記: send/recv ですが、これらはデータの送受信を保証しない為、問題になる事があります。 例えば send() の説明ではこのように説明されてます。(recv()も同様) > > 戻り値として、送信したバイト数を返します。アプリケーションでは、**必ず戻り値をチェックし、全てのデータが送られた事を確認する必要があります。データの一部だけが送信された場合、アプリケーションで残りのデータを再送信してください。** ソケットプログラミング HOWTO に、さらに詳しい情報があります。 > > > 実際にはこのような処理を自分で書くことは稀で、 より高水準なライブラリやフレームワークを使います。 * socketモジュールの sendall や makefileとread について調べてみてください。 * 他: socketserver フレームワーク 同時接続の場合についてもサンプルコードあり。