プログラミング

PythonでTCP/IP通信を使おう!


Warning: count(): Parameter must be an array or an object that implements Countable in /home/c9962019/public_html/mochinoki-labo.com/wp-content/plugins/rich-table-of-content/functions.php on line 490

こんにちは、MSKです。
今日は、PythonでTCP/IP通信を行います。
TCP/IPの概要を解説して、Pythonで実際の動きをみたいと思います。

TCP/IPとは

TCP/IP(Transmission Control Protocol/Internet Protocol)とは、インターネット通信や無線通信などに使われている通信プロトコルです。

TCP/IPは今使われている通信プロトコルの中でも最も使われているものの1つです。

TCP/IPの他に有名なものとしてUDPが上げられると思います。

さっきから出てきている「通信プロトコル」とはどういうものかというと、「データ通信を行う際に、送信側と受信側であらかじめ定められた共通のルール」です。

日本語しかわからない人に英語で指示をしても伝わらないように、データ通信の世界でも、この共通のルールを定めておかなければ、送信側と受信側のデータの解釈が違う可能性があり正しいデータを伝えることができない可能性があります。

TCP/IPの特徴は、信頼の高い通信を行うことができることです。
送信したいデータを確実に相手に届けたい場合に使います。

※UDPは逆に速度重視で、多少のデータのロストは問題視しない場合に使用します。

TCP/IPはコネクション型通信(送信側と受信側が1対1で通信を行う)です。
通信の手順は次の通りです。

  1. 通信の確立
  2. データ送受信
  3. 通信の終了

PythonでTCP/IP通信を使おう!

では、TCP/IPの通信をPythonでプログラムを組みながら見ていきたいと思います。

pythonでTCP/IP通信を行うためにはsocketモジュールをimportします。

socketモジュールはBSDのsocketインターフェイスを提供するモジュールです。

TCPサーバーをプログラムしよう

TCPサーバー側のプログラムは次のように作ります。

  1. socketを作成
  2. そのsocketにホスト名とローカルポートを割り当て
  3. listenすることによりserverの動作を開始
  4. acceptして接続を受け付ける状態にします
  5. 接続が行われたら、recvで送信されるデータを待ちます
  6. データ通信が終わったら、TCP clientのsocketとTCP serverのsocketを閉じます

ソースは以下になります。
tcp_server.pyという名前でファイルを作成します。

import socket

HOST_NAME = "127.0.0.1"
PORT = 8080

#ipv4を使うので、AF_INET
#tcp/ip通信を使いたいので、SOCK_STREAM
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#localhostとlocal portを指定
sock.bind((HOST_NAME,PORT))
#server動作開始
sock.listen(1)
#接続を許可して、待つ
client,remote_addr = sock.accept()
print("accepted remote. remote_addr {}.".format(remote_addr))
while True:
    #接続されたら、データが送られてくるまで待つ
    rcv_data = client.recv(1024)
    #接続が切られたら、終了
    if not rcv_data:
        print("receive data don't exist")
        break
    else:
        print("receive data : {} ".format(rcv_data.decode("utf-8")))
        #clientにOKを送信
        client.sendall('OK\n'.encode())
print("close client communication")
#clientとserverのsocketを閉じる
client.close()
sock.close()

動作確認をします。
ターミナルを開いて、python tcp_server.pyで実行します。

新規に別のターミナルを開いて次のコマンドを打ち込みます。

nc -v 127.0.0.1 8080

Enterを押すとserver.pyを実行しているターミナルの方に次のように出力があると思います。

Connection to 127.0.0.1 port 8080 [tcp/http-alt] succeeded!

と表示されると接続が成功しています。
適当に文字を入力してEnterを押すとPythonプログラムの方のログに入力した文字が表示されると思います。

TCPクライアントをプログラムしよう

TCPクライアントのプログラムを作っていきます。

クライアント側のプログラムは次のような流れになります。

  1. socketを作成
  2. サーバーのhost名とポートを指定して接続を行います
  3. 接続後、データ通信を行います

ソースは以下になります。
tcp_client.pyという名前でファイルを作成します。

import socket

HOST_NAME = "127.0.0.1"
PORT = 8080

#ipv4を使うので、AF_INET
#tcp/ip通信を使いたいので、SOCK_STREAM
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#サーバーと接続
sock.connect((HOST_NAME,PORT))
#データ送信
sock.send(b"Hello, TCP")
#サーバーからデータ受信
rcv_data = sock.recv(1024)
print("receive data : {}".format(rcv_data))
sock.close()

動作を確認します。
まず、1つ上で作ったtcp_server.pyを使ってサーバーを立ち上げます。

別のターミナルを新規に開いて、次のように入力します。

python tcp_client.py

サーバー側にHello,TCPと表示され、クライアント側にOKと返ってきていれば通信は成功しています。

まとめ

TCP/IPは通信プロトコルの1つで、信頼性の高い通信を行う際に使用されます。
通信プロトコルとは「データ通信を行う際に、送信側と受信側であらかじめ定められた共通のルール」です。

TCP/IPは通信の確立→データ通信→通信の終了という手順を踏みます。

Pythonではsocketというライブラリをimportすることで使うことができます。

最後までご覧頂き、ありがとうございます。

以上、「PythonでTCP/IP通信を使おう!」でした。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近RustとReact、結び目理論と曲面結び目理論にはまっています。