63934


[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]


CC BY-SA 4.0
2020-03-16T11:16:03.220
63902
2020-03-17T11:55:20.867
2020-03-16T11:51:36.793
3060
34471
question
python network socket
PythonのTCP通信で複数回の送受信


**【回答】**  
`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]

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


CC BY-SA 4.0
2020-03-17T11:55:20.867
63934
2020-03-17T11:55:20.867
35558
63902
answer