Python 3.4+Асинхронное программированиепонятие
asyncio.DatagramProtocol
протоколы и транспорты
Протокол для датаграмм (UDP): цикл вызывает datagram_received(data, addr) на каждый пакет и error_received() при ошибке отправки или приёма.
Синтаксис
transport, protocol = await loop.create_datagram_endpoint(ProtocolClass, local_addr=...)
Для UDP высокоуровневого API потоков в asyncio нет, поэтому DatagramProtocol — единственный штатный путь. В отличие от TCP, границы сообщений сохраняются: один sendto() — один datagram_received(), но доставка и порядок не гарантированы. Отправляют через transport.sendto(), а не через write(); error_received() часто означает ICMP «порт недоступен» после sendto() на закрытый порт.
Примеры
import asyncio
class Collector(asyncio.DatagramProtocol):
def datagram_received(self, data, addr):
print('пакет', data) # → пакет b'one' / пакет b'two'
async def main():
loop = asyncio.get_running_loop()
server, _ = await loop.create_datagram_endpoint(Collector, local_addr=('127.0.0.1', 0))
addr = server.get_extra_info('sockname')
client, _ = await loop.create_datagram_endpoint(
asyncio.DatagramProtocol, remote_addr=addr)
client.sendto(b'one')
client.sendto(b'two')
await asyncio.sleep(0.01)
client.close()
server.close()
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности