【Python3】ソケット通信でデータの送受信を行う方法(UDP)

おはこんばんにちは、せなです。
UDPのソケット通信でデータの送受信を行う方法を説明したいと思います。

初めに

UDPはデータダイヤグラム型の通信方法です。
TCPと比較すると以下の様な違いがあります。

UDPTCP
通信方法データダイヤグラム型コネクション型
通信速度高速低速
通信信頼性低い高い
特徴速度重視信頼性重視

上記を理解した上で、UDPのソケット通信でデータの送受信を行う方法を説明したいと思います。

送信側の処理

送信側の処理の流れとしては以下のようになります。

1. ソケットを作成する。
2. 送信するデータを作成する。
3. sendtoでデータを送信する。

from socket import socket, AF_INET, SOCK_DGRAM

HOST = ""
PORT = 5000
# 自分に送信
ADDRESS = "127.0.0.1"

sock = socket(AF_INET, SOCK_DGRAM)
while True:
    try:
        # メッセージ
        msg = input("メッセージを入力してください: ")
        # 送信
        sock.sendto(msg.encode(), (ADDRESS, PORT))
    except KeyboardInterrupt:
        print("終了します")
        sock.close()

受信側の処理

受信側の処理の流れとしては以下のようになります。

1. ソケットを作成する。
2. bindでIPアドレスとポート番号を指定する。
3. recvfromでデータを受信する。

from socket import socket, AF_INET, SOCK_DGRAM

HOST = ""
PORT = 5000

# ソケットを用意
s = socket(AF_INET, SOCK_DGRAM)
# バインドしておく
s.bind((HOST, PORT))

while True:
    try:
        # 受信
        msg, address = s.recvfrom(65535)
        print(f"message: {msg}\nfrom: {address}")
    except KeyboardInterrupt:
        print("終了します")
        # ソケットを閉じる
        sock.close()

注意点

recvfrom(x)で指定するxは、受信するデータの最大バイト数になります。(65535バイトがUDPにおける上限)

最大バイト数を超えるデータを受信した場合は、超えた分のデータが切り捨てられてしまうため、受信するデータの最大バイト数を超えないように注意してください。(不完全なデータになります。)

※受信の際には、データを受信するまで処理がブロックされるので、別スレッドで受信処理を行うことをおすすめします。

Python

Posted by sena