Open1
def connection_made(self, transport): self.transport = transport ➡︎ transportの意味
example.py
class ChatServerProtocol(asyncio.DatagramProtocol): # UDP用の非同期プロトコルクラス
def __init__(self):
self.transport = None # UDPソケットの送受信用オブジェクト
def connection_made(self, transport):
self.transport = transport # サーバーソケットが作成されたときに呼ばれる
def datagram_received(self, data, addr):
if not data:
return # データが空なら何もしない
usernamelen = data[0] # 最初の1バイトはユーザー名の長さ
username = data[1:1+usernamelen].decode('utf-8') # ユーザー名部分をデコード
message = data[1+usernamelen:].decode('utf-8') # 残りがメッセージ本文
print(f"Received from {username}@{addr}: {message}") # 受信内容を表示
clients[addr] = time.time() # クライアントの最終通信時刻を更新
# 他の全クライアントにメッセージをリレー
for client in clients.keys():
if client != addr: # 送信元以外に送信
try:
self.transport.sendto(data, client) # UDPでデータを送信
except Exception as e:
print(f"Failed to send message to {client}: {e}") # 送信失敗時のエラー表示
method.py
def connection_made(self, transport):
self.transport = transport
self.transport = transport
の意味は、
**「このプロトコルインスタンス(ChatServerProtocol)が、UDPソケット(=transportオブジェクト)を使ってデータの送受信をできるように、その参照を保存している」**ということです。
詳しく
-
transport
は、asyncio
の「トランスポート」オブジェクトで、
UDPソケットの送受信を抽象化したものです。 -
connection_made(self, transport)
は、
サーバーソケットが作成されたときにasyncio
が自動で呼び出し、
その時に「このUDPソケットを使ってね」という意味でtransport
を渡します。 - これを
self.transport
に保存しておくことで、
後でself.transport.sendto(...)
でデータを送信できるようになります。
まとめ
-
transport
は「UDPソケットそのもの」だと思ってOKです。 - これを
self.transport
に保存することで、
どのタイミングでもデータ送信ができるようになります。