# UDPのクライアントを作ってみる それでは、簡単なUDPのクライアントを作ってみましょう。 どういうものにするかは、2段階で行ってみます。 1. 単純に送って受ける、echoのようなシステム。 2. JSON形式のデータを送信し、簡単な処理を送り返してもらうシステム。 ```{note} JSON版はもう少しお待ちください、後半で行う予定です。 ``` まずは単純なものから行ってみましょう。 ## UDP echoクライアント UDPでのechoクライアントを記述して、基本的なネットワークの操作コードを確認していきましょう。 ファイル名は{file}`echo-client.py`とします。 ```{literalinclude} sources/echo/echo-client.py :language: python :linenos: ``` いろいろしている感じもありますが、実はネットワークに関してはたいしたことはしていません。 少し読み込んでいきましょう。 ### ソケットの利用 ```{literalinclude} sources/echo/echo-client.py :language: python :lines: 6 ``` ネットワークの通信では、ソケット(socket)という概念を使用します。 言葉として聞くであろうソケットであり、言い換えればケーブルのようなものです。 ただ、ソケットでは『皮』と『中身』を決めてあげる必要があります。 - 皮: ソケットをケーブルと見立てたときの皮であり、どのような材質で相手までひっぱるかになります。 - シンボル`AF_INET`(`socket.AF_INET`)は、IPv4のインターネットプロトコルを使用することを意味します。 - 今回は使いませんが、IPv6もちろん可能で、`AF_INET6`(`socket.AF_INET6`)を使うこともできます。 - 中身: ソケット(ケーブル)の中身の材質みたいなものです、具体的にはTCPを使うかUDPを使うかということになります。 - シンボル`SOCK_DGRAM`(`socket.SOCK_DGRAM`)は、UDPを使用することを意味します。 - TCPを使う場合は、`SOCK_STREAM`(`socket.SOCK_STREAM`)を使います。 ```{note} DGRAMは**データグラム**のことです。データグラムという『データのかたまり』を使った通信のことをUDPと呼びます。 TCPは**ストリーム通信**という仕組みを用いて行うため、指定が `socket.SOCK_STREAM` となっています。 ``` ### データの送信 データグラムの通信では、過去に学んだように『投げつける』感覚です。そのため、ソケットを作ったとしても明確な接続は行いません。すごく楽ですね。 ```{literalinclude} sources/echo/echo-client.py :language: python :lines: 10-12 :emphasize-lines: 3 ``` 見ての通りで、生成したソケット(`sock`)を用いての`sendto()` です。 送りたいデータと送り先をしているだけとなっています。相手との接続確認とかありません。 ### データの受信 さて、ソケットによる送信を行ったとき、ソケットの両端はトランスポート(UDP)であるため、ポートによる端点の識別が機能しています。 - 送り先: コード内で指定したポート番号(今回は10000) - 送り元: 特に指定していないので『OSのお任せ』で設定(調べない限りわからない) この情報は、UDPのヘッダにより相手(接続先)に送られているため、受信側はその情報を基に『必要があれば』返信します。 この操作も『事前の接続なしに』送られてくるため、すぐに受け取れるように待機する必要があります。 ```{literalinclude} sources/echo/echo-client.py :language: python :lines: 15-17 :emphasize-lines: 2 ``` ソケットの`recvfrom()`を使うことで、受信待機を行います。 引数は受信データの最大サイズとなります。 戻り値は2つ(タプルで受け取っている)です。 1. 受信データ(`data`で受け取っている) 2. サーバー側のアドレス情報(`server`で受け取っている) このアドレス情報は、受信したデータの送り元(すなわちサーバー)の情報となります。 今回は単純に表示しているだけですが、この情報を適宜操作してアプリケーションが利用することとなります。 ## まとめ UDPのクライアント側は非常にシンプルな操作となっています。 この部分がUDPの特徴となっています。 続いて、サーバー部分を見てみましょう。