PythonのTCP通信で複数回の送受信


[Qiitaの記事](https://qiita.com/keiusukematsuda/items/362450fda4beca76c030)を参考に、TCP通信のコードを作成しています。  
ほとんどQiitaの記事のままなのですが1回のみ通信するのではなく、複数回の通信をできるように書き換えています。

下記の2つのコードを実行すると、問題なくサーバー側で0から9999までの数値がprintされたのですが、通信周りのコードに疎く、このコードで大丈夫なのか自信がないため、何かおかしなことをやっていたら教えてほしいです。

* * *

**クライアント側のコード**

[code]

    # -*- coding : UTF-8 -*-
    
    # 0.ライブラリのインポートと変数定義
    import socket
    
    target_ip = "127.0.0.1"
    target_port = 8080
    buffer_size = 4096
    
    i = 0
    while True:
        if i == 10000:
            break
    
        # 1.ソケットオブジェクトの作成
        tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
        # 2.サーバに接続
        tcp_client.connect((target_ip,target_port))
        # 3.サーバにデータを送信
        tcp_client.send(str(i).encode())
    
        # 4.サーバからのレスポンスを受信
        response = tcp_client.recv(buffer_size)
        print("[*]Received a response : {}".format(response))
        i = i + 1
    
[/code]

**サーバー側のコード**

[code]

    # -*- coding : UTF-8 -*-
    
    # 0.ライブラリのインポートと変数定義
    import socket
    
    server_ip = "127.0.0.1"
    server_port = 8080
    listen_num = 5
    buffer_size = 1024
    
    # 1.ソケットオブジェクトの作成
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2.作成したソケットオブジェクトにIPアドレスとポートを紐づける
    tcp_server.bind((server_ip, server_port))
    
    # 3.作成したオブジェクトを接続可能状態にする
    tcp_server.listen(listen_num)
    
    # 4.ループして接続を待ち続ける
    while True:
        # 5.クライアントと接続する
        client,address = tcp_server.accept()
        print("[*] Connected!! [ Source : {}]".format(address))
    
        # 6.データを受信する
        data = client.recv(buffer_size)
        print("[*] Received Data : {}".format(data))
    
        # 7.クライアントへデータを返す
        client.send(b"ACK!!")
    
        # 8.接続を終了させる
        client.close()
    
[/code]




**【回答】**  
`taichiさん`のコードでも複数回の送受信ができますが`zakki 5`さんのコメントにあるように、1回のコネクションで複数回の送受信も可能です。

* * *

**【コード例】**  
**クライアント側のコード**

[code]

    # 0.ライブラリのインポートと変数定義
    import socket
    target_ip = "127.0.0.1"
    target_port = 8080
    buffer_size = 4096
    for i in range(10):
        # 1.ソケットオブジェクトの作成
        tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        print("tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)")
        # 2.サーバに接続
        tcp_client.connect((target_ip,target_port))
        print("tcp_client.connect((target_ip,target_port))")
        for ii in range(10):
            # 3.サーバにデータを送信
            tcp_client.send(str(i).encode())
            # 4.サーバからのレスポンスを受信
            response = tcp_client.recv(buffer_size)
            if response == b"":
                break
            print("[*]Received a response : {}".format(response))
        # 5.接続を終了させる
        tcp_client.close()
    
[/code]

**サーバー側のコード**

[code]

    # -*- coding : UTF-8 -*-
    # 0.ライブラリのインポートと変数定義
    import socket
    server_ip = "127.0.0.1"
    server_port = 8080
    listen_num = 5
    buffer_size = 1024
    # 1.ソケットオブジェクトの作成
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.作成したソケットオブジェクトにIPアドレスとポートを紐づける
    tcp_server.bind((server_ip, server_port))
    # 3.作成したオブジェクトを接続可能状態にする
    tcp_server.listen(listen_num)
    # 4.ループして接続を待ち続ける
    while True:
        # 5.クライアントと接続する
        client,address = tcp_server.accept()
        print("[*] Connected!! [ Source : {}]".format(address))
        while True:
            # 6.データを受信する
            data = client.recv(buffer_size)
            if data == b"":
                break
            print("[*] Received Data : {}".format(data))
            # 7.クライアントへデータを返す
            client.send(b"ACK!!")
        # 8.接続を終了させる
        client.close()
    
[/code]

**【コネクションの切断作法】**  
コネクションを切断するときの作法と切断を検出するときの作法に自信がありません、どなたか詳しい方に回答を投稿していただきたいです。




**【回答】**  
`taichiさん`のコードでも複数回の送受信ができますが`zakki 5`さんのコメントにあるように、1回のコネクションで複数回の送受信も可能です。

* * *

**【コード例】**  
**クライアント側のコード**

[code]

    # 0.ライブラリのインポートと変数定義
    import socket
    target_ip = "127.0.0.1"
    target_port = 8080
    buffer_size = 4096
    for i in range(10):
        # 1.ソケットオブジェクトの作成
        tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        print("tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)")
        # 2.サーバに接続
        tcp_client.connect((target_ip,target_port))
        print("tcp_client.connect((target_ip,target_port))")
        for ii in range(10):
            # 3.サーバにデータを送信
            tcp_client.send(str(i).encode())
            # 4.サーバからのレスポンスを受信
            response = tcp_client.recv(buffer_size)
            if response == b"":
                break
            print("[*]Received a response : {}".format(response))
        # 5.接続を終了させる
        tcp_client.close()
    
[/code]

**サーバー側のコード**

[code]

    # -*- coding : UTF-8 -*-
    # 0.ライブラリのインポートと変数定義
    import socket
    server_ip = "127.0.0.1"
    server_port = 8080
    listen_num = 5
    buffer_size = 1024
    # 1.ソケットオブジェクトの作成
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.作成したソケットオブジェクトにIPアドレスとポートを紐づける
    tcp_server.bind((server_ip, server_port))
    # 3.作成したオブジェクトを接続可能状態にする
    tcp_server.listen(listen_num)
    # 4.ループして接続を待ち続ける
    while True:
        # 5.クライアントと接続する
        client,address = tcp_server.accept()
        print("[*] Connected!! [ Source : {}]".format(address))
        while True:
            # 6.データを受信する
            data = client.recv(buffer_size)
            if data == b"":
                break
            print("[*] Received Data : {}".format(data))
            # 7.クライアントへデータを返す
            client.send(b"ACK!!")
        # 8.接続を終了させる
        client.close()
    
[/code]

**【コネクションの切断作法】**  
コネクションを切断するときの作法と切断を検出するときの作法に自信がありません、どなたか詳しい方に回答を投稿していただきたいです。

