ネットワークプログラミング(ソケットプログラミング)と言えばC言語を使って書くことが多いです。
実際ネットワークプログラミングについて調べてみるとC言語の解説が非常に多いです。
C言語は動作が早いため、組み込みやネットワークなどの低レイヤーで使われることがほとんどです。
そのため、ネットワークプログラミングもC言語を使って行うことが多いのです。
私も大学生の頃に、C言語を使ったソケットプログラミングを習いました。
では、何故わざわざPythonを使ってネットワークプログラミングをするのでしょうか?
理由は単純で、Pythonはできることが非常に多く、今後使われる機会がどんどん増えてくるであろう言語だからです。
AIや自動化だけでなくWebシステムや低レイヤーまでもPythonで書けてしまうのです!
C言語は使われる場面が非常に限られてくる上、非常に難易度が高いため今から始めようとする人にとっては向いていないと考えられます。
そのため今回は、Pythonを使ったネットワークプログラミングの入門として、ソケット通信を行う簡単なプログラムを組んでみます。
ソケット通信の流れ
ネットワークプログラミングをするにあたって、まずはソケット通信のコードを書いてみます。
処理の流れとしてはそれぞれ以下のようになります。
- ソケットの作成
- ソケットの設定とサーバへの接続
- データのやり取り
- コネクションの切断
- ソケットの作成
- IPアドレスとポート番号の設定
- 接続の待ち受け
- 通信用ソケットの取得
- データのやり取り
- コネクションの切断
今回はTCPを使ったものとなります。
UDPについては、また次回以降に書いていきます。
ソケット通信で使用する関数
ソケット通信は上記の通りに行いますが、それぞれの処理について1からコードを書く必要はありません。
それぞれの処理について関数が用意されています。
- ソケットの作成 → socket()
- ソケットの設定とサーバへの接続 → connect()
- データのやり取り → send(), recv()
- コネクションの切断 → close()
- ソケットの作成 → socket()
- IPアドレスとポート番号の設定 → bind()
- 接続の待ち受け → listen()
- 通信用ソケットの取得 → accept()
- データのやり取り → send(), recv()
- コネクションの切断 → close()
ではこれらの関数を使って実際にコードを書いてみましょう。
クライアントの作成
まずはクライアント側のプログラムを作っていきます。
上記の通りの流れでコードを書いていきます。
import socket
HOST = '127.0.0.1' #接続先IPアドレス
PORT = 10000 #使用するポート番号
# 1.ソケットの作成
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.サーバへの接続
client.connect((HOST, PORT))
# 3.サーバからのメッセージ受信
data = client.recv(4096)
print(data.decode("UTF-8"))
# 4.コネクションの切断
client.close()
ソケット通信の流れに対応するようコメントを付けて書いてみました。
まずは最小構成ということで、このクライアントの接続先は自分自身である127.0.0.1、ポート番号は10000としてあります。
ただ、このクライアントだけでは動作しないので、サーバプログラムについても作っていきます。
サーバの作成
先程作成したクライアントと通信を行うためのサーバを作っていきます。
import socket
PORT = 10000 #使用するポート番号
# 1.ソケットの作成
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.アドレスとポート番号の設定
server.bind(("", PORT))
# 3.接続の待ち受け
server.listen()
# 4.通信用ソケットの取得
client, addr = server.accept()
# 5.クライアントへのメッセージ送信
client.send(b"Hello World!!n")
# 6.コネクションの切断
client.close()
#サーバソケットのクローズ
server.close()
こちらもソケット通信の流れに対応させてコメントを付けてあります。
クライアントからの接続を待って、接続されるとそのクライアントへ「Hello World」とメッセージを送信したあと終了するという非常にシンプルな動作をするサーバです。
今回は同一マシン内で完結しているためIPアドレスにはどちらも127.0.0.1、ポート番号は指定している10000を使っての通信となります。
(サーバからは接続しに行くことはないため、IPアドレスの指定はする必要はないです)
サーバがクライアントへsendでメッセージを送る際はbyte型へと変換してから送信する必要があるので注意です。
Pythonを使ったネットワークプログラミング入門まとめ
Pythonを使ってクライアントとサーバ間でメッセージをTCPにて送受信するシンプルなプログラムを作りました。
今回はクライアントがrecv()で受信、サーバがsend()で送信しましたが、recv()とsend()を逆にすればクライアントからサーバへの送信もできます。
今回作成したプログラムは1回送受信したら終了してしまいますが、実際に使用するプログラムはそういう訳にはいきません。
次回は今回作成したプログラムを改良して、繰り返し送受信ができるようにしていきます。
今回参考にした書籍を以下に貼っておきますので、興味を持った方はぜひ読んでみてください。