Python Glossary English

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Сообщить о неточности