Python 3.4+Асинхронное программированиепонятие
asyncio.DatagramTransport
протоколы и транспорты
Транспорт для датаграмм (UDP): sendto(data, addr) отправляет пакет, abort() закрывает сразу. Его возвращает loop.create_datagram_endpoint().
Синтаксис
transport.sendto(data, addr=None); transport.abort()
Это пара к asyncio.DatagramProtocol; для TCP он не нужен вовсе. sendto() — не корутина и не ждёт доставки: пакет уходит в буфер, а потеря по дороге никак не сообщается. Если при создании задан remote_addr, адрес в sendto() не передают (или передают тот же), иначе ValueError; без remote_addr адрес обязателен на каждый пакет. В Python 3.11 UDP-транспорт селекторного цикла даже не наследует DatagramTransport, так что isinstance() ненадёжен.
Примеры
import asyncio
class Echo(asyncio.DatagramProtocol):
def connection_made(self, transport):
self.transport = transport
def datagram_received(self, data, addr):
self.transport.sendto(data.upper(), addr) # ответить отправителю
class Client(asyncio.DatagramProtocol):
def datagram_received(self, data, addr):
print('ответ', data) # → ответ b'HI'
async def main():
loop = asyncio.get_running_loop()
server, _ = await loop.create_datagram_endpoint(Echo, local_addr=('127.0.0.1', 0))
client, _ = await loop.create_datagram_endpoint(Client, local_addr=('127.0.0.1', 0))
client.sendto(b'hi', server.get_extra_info('sockname'))
await asyncio.sleep(0.01)
client.close()
server.close()
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности