こんにちは、MSKです。
今回はUDP通信をPythonで行いたいと思います。
UDP通信の概要を解説して、実際にコードを書いて動作をみたいと思います。
UDPとは
UDPはTCP/IPと同じくらいメジャーな通信プロトコルの1つです。
※PythonでTCP/IPを試した記事は以下になります。TCP/IPというものがどういうものかも簡単に触れています。
UDPの特徴はコネクションレスによる高速通信です。
リアルタイム性が求められる通信に使われます。
一方、データの信頼性は高くないため、確実な通信を行う場合には注意が必要です。
(というより、TCP/IPを選んだほうが良いと思われます。)
PythonでUDP通信を確認しよう
今回のサンプルではUDPのブロードキャスト通信を行ってみます。
UDPはTCP/IPと違い、1対多の通信を行うことができます。
ブロードキャスト・アドレス(255.255.255.255)に送信することで同一ネットワークの該当するポートで待ち受けているアプリケーションがあれば、そのようなアプリケーション全てにパケットを届けます。
これがブロードキャストです。
受信側プログラム
受信側のプログラムを作成します。
recv.pyという名前でファイルを作成します。
プログラムの流れは以下のようになります。
- DGRAMを指定してsocketを作成
- hostを空文字にして、ホスト名とポートを指定してbind
- 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という名前でファイルを作成します。
送信側のプログラムの流れは以下になります。
- DGRAMを指定してsocketを作成
- ブロードキャストを行うのでsetsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)を記述
- データ送信
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通信をやってみよう!」でした。
最後までご覧いただき、ありがとうございます。