ネットワークプログラミング(ソケットプログラミング)と言えばC言語を使って書くことが多いです。
実際ネットワークプログラミングについて調べてみるとC言語の解説が非常に多いです。
C言語は動作が早いため、組み込みやネットワークなどの低レイヤーで使われることがほとんどです。
そのため、ネットワークプログラミングもC言語を使って行うことが多いのです。
では、何故わざわざPythonを使ってネットワークプログラミングをするのでしょうか?
理由は単純で、Pythonはできることが非常に多く、今後使われる機会がどんどん増えてくるであろう言語だからです。
AIや自動化だけでなくWebシステムや低レイヤーまでもPythonで書けてしまうのです!
C言語は使われる場面が非常に限られてくる上、非常に難易度が高いため今から始めようとする人にとっては向いていないと考えられます。
そのため今回は、Pythonを使ったネットワークプログラミングの入門として、ソケット通信を行う簡単なプログラムを組んでみます。
独学で勉強するのがつらいと感じてませんか?
勉強中にわからないことが出てきて解決できないと、モチベーションが一気に下がってしまいますよね。
そうならないための対処方法は、誰かに質問できる環境を作ることです。
質問できる環境を作ることで、効率よく勉強を進めることができるようになります。
また、質問をするためには、何がどうわからないかをしっかり把握する必要があるため、質問後の理解度が全然違ってきます。
その結果、独学で勉強するより
- 時間
- 効率
- 理解度
全てにおいて上回ることができます。
TechAcademyであれば、1週間無料でプログラミングスクールの体験をオンラインで受けることが可能です。
この無料期間にわからない部分の質問をするのもいいですし、プログラミングスクールの雰囲気も体験できるので、いい刺激になりますよ。
ソケット通信の流れ
ネットワークプログラミングをするにあたって、まずはソケット通信のコードを書いてみます。
処理の流れとしてはそれぞれ以下のようになります。
今回はTCPを使ったものとなります。
UDPについてはまた次回以降に書いていきます。
<クライアント側>
1.ソケットの作成
2.ソケットの設定とサーバへの接続
3.データのやり取り
4.コネクションの切断
<サーバ側>
1.ソケットの作成
2.アドレスとポート番号の設定
3.接続の待ち受け
4.通信用ソケットの取得
5.データのやり取り
6.コネクションの切断
ソケット通信で使用する関数
ソケット通信は上記の通りに行いますが、それぞれの処理について1からコードを書く必要はありません。
それぞれの処理について関数が用意されています。
<クライアント側>
1.ソケットの作成 → socket()
2.ソケットの設定とサーバへの接続 → connect()
3.データのやり取り → send(), recv()
4.コネクションの切断 → close()
<サーバ側>
1.ソケットの作成 → socket()
2.アドレスとポート番号の設定 → bind()
3.接続の待ち受け → listen()
4.通信用ソケットの取得 → accept()
5.データのやり取り → send(), recv()
6.コネクションの切断 → 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を使ってクライアントとサーバ間でメッセージをTCPにて送受信するシンプルなプログラムを作りました。
今回はクライアントがrecv()で受信、サーバがsend()で送信しましたが、recv()とsend()を逆にすればクライアントからサーバへの送信もできます。
今回作成したプログラムは1回送受信したら終了してしまいますが、実際に使用するプログラムはそういう訳にはいきません。
次回は今回作成したプログラムを改良して、繰り返し送受信ができるようにしていきます。
今回参考にした書籍を以下に貼っておきますので、興味を持った方はぜひ読んでみてください。
ConoHa VPSを使えば、クラウド上に自分だけの開発環境を構築することができます!
- 1回環境を作ればマシン毎に作り直す必要がなくなる
- 開発途中のコードを外出先からでも簡単にいじることができる
- 従量課金制で使うこともできる
- 従量課金制で使った場合でも上限を超えることはない
