Python Glossary English

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