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