Python Glossary Русский

Python 3.4+Async programmingterm

asyncio.DatagramTransport

protocols and transports

The transport for datagrams (UDP): sendto(data, addr) sends a packet and abort() closes at once. loop.create_datagram_endpoint() returns it.

Syntax

transport.sendto(data, addr=None); transport.abort()

It pairs with asyncio.DatagramProtocol and is useless for TCP. sendto() is not a coroutine and does not wait for delivery: the packet goes into a buffer, and loss on the way is never reported. If remote_addr was given at creation, omit the address in sendto() (or pass the same one), otherwise ValueError; without remote_addr every packet needs an address. On Python 3.11 the selector loop's UDP transport does not even inherit DatagramTransport, so isinstance() is unreliable.

Examples

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())

See also

Open in the full glossarydocs.python.orgReport an inaccuracy