【Python3】ソケット通信でデータの送受信を行う方法(UDP)
おはこんばんにちは、せなです。
UDPのソケット通信でデータの送受信を行う方法を説明したいと思います。
初めに
UDPはデータダイヤグラム型の通信方法です。
TCPと比較すると以下の様な違いがあります。
UDP | TCP | |
通信方法 | データダイヤグラム型 | コネクション型 |
通信速度 | 高速 | 低速 |
通信信頼性 | 低い | 高い |
特徴 | 速度重視 | 信頼性重視 |
上記を理解した上で、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における上限)
最大バイト数を超えるデータを受信した場合は、超えた分のデータが切り捨てられてしまうため、受信するデータの最大バイト数を超えないように注意してください。(不完全なデータになります。)
※受信の際には、データを受信するまで処理がブロックされるので、別スレッドで受信処理を行うことをおすすめします。
ディスカッション
コメント一覧
まだ、コメントがありません