プログラミング

PythonでUDP通信をやってみよう!

こんにちは、MSKです。
今回はUDP通信をPythonで行いたいと思います。
UDP通信の概要を解説して、実際にコードを書いて動作をみたいと思います。

UDPとは

UDPはTCP/IPと同じくらいメジャーな通信プロトコルの1つです。

※PythonでTCP/IPを試した記事は以下になります。TCP/IPというものがどういうものかも簡単に触れています。

PythonでTCP/IP通信を使おう!PythonでTCP/IP通信を行います。 TCP/IPの概要を解説して、Pythonで実際の動きをみたいと思います。...

UDPの特徴はコネクションレスによる高速通信です。
リアルタイム性が求められる通信に使われます。
一方、データの信頼性は高くないため、確実な通信を行う場合には注意が必要です。
(というより、TCP/IPを選んだほうが良いと思われます。)

PythonでUDP通信を確認しよう

今回のサンプルではUDPのブロードキャスト通信を行ってみます。
UDPはTCP/IPと違い、1対多の通信を行うことができます。
ブロードキャスト・アドレス(255.255.255.255)に送信することで同一ネットワークの該当するポートで待ち受けているアプリケーションがあれば、そのようなアプリケーション全てにパケットを届けます。
これがブロードキャストです。

受信側プログラム

受信側のプログラムを作成します。
recv.pyという名前でファイルを作成します。

プログラムの流れは以下のようになります。

  1. DGRAMを指定してsocketを作成
  2. hostを空文字にして、ホスト名とポートを指定してbind
  3. recvfromで待ち受け
import socket

HOST_NAME = ''   
PORT = 8080
#ipv4を使うので、AF_INET
#udp通信を使いたいので、SOCK_DGRAM
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#ブロードキャストするときは255.255.255.255と指定せずに空文字
sock.bind((HOST_NAME, PORT))

while True:
    #データを待ち受け
    rcv_data, addr = sock.recvfrom(1024)
    print("receive data : [{}]  from {}".format(rcv_data,addr))

sock.close()

コメントに書いていますが、ブロードキャストを待ち受ける時は255.255.255.255ではなく、空文字を指定してbindします。

送信側プログラム

送信側のプログラムを作成します。
trans.pyという名前でファイルを作成します。

送信側のプログラムの流れは以下になります。

  1. DGRAMを指定してsocketを作成
  2. ブロードキャストを行うのでsetsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)を記述
  3. データ送信
import socket

HOST_NAME = ''
PORT = 8080
#ipv4を使うので、AF_INET
#udp通信を使いたいので、SOCK_DGRAM
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#ブロードキャストを行うので、設定
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
#データ送信
sock.sendto(b"Hello, UDP BroadCast", (HOST_NAME, PORT))

sock.close()

注意するのはブロードキャストを行う際にsock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)を記述することです。
これがないと送信に失敗します。

動作確認

先にrecv.pyを起動します。

python recv.py

プログラムが動き、待ち受ける状態になると思います。

別のターミナルからtrans.pyを起動します。

python trans.py

recv.py側に

receive data :  [Hello, UDP BroadCast] from ('127.0.0.1', xxxxx)

と出ていれば成功です。

まとめ

信頼性は高くないけど、高速の通信ができるUDPをPythonで試してみました。
Pythonではsocketをimportして、socketのインスタンスを準備してrecvfromで待ちうける・sendtoで送信することで受信側と送信側を作ることができます。

以上、「PythonでUDP通信をやってみよう!」でした。
最後までご覧いただき、ありがとうございます。

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