import asyncio import sys USE_PROACTOR = True async def _(): await asyncio.sleep(.1) class Protocol(asyncio.DatagramProtocol): def error_received(self, ex): print(ex) def datagram_received(self, data, addr): print("datagram received", data) if USE_PROACTOR: loop = asyncio.new_event_loop() else: loop = asyncio.SelectorEventLoop() asyncio.set_event_loop(loop) async def create_server(): return (await loop.create_datagram_endpoint( Protocol, local_addr=('127.0.0.1', 8000), ))[0] server_transport = loop.run_until_complete(create_server()) async def create_client(): return (await loop.create_datagram_endpoint( asyncio.DatagramProtocol, local_addr=('127.0.0.1', 8001), ))[0] client_transport = loop.run_until_complete(create_client()) client_transport.sendto(b'ping 1', addr=('127.0.0.1', 8000)) loop.run_until_complete(_()) server_transport.sendto(b'pong', addr=('127.0.0.1', 8001)) loop.run_until_complete(_()) client_transport.sendto(b'ping 2', addr=('127.0.0.1', 8000)) loop.run_until_complete(_()) server_transport.sendto(b'pong', addr=('127.0.0.1', 8003)) loop.run_until_complete(_()) client_transport.sendto(b'ping 3', addr=('127.0.0.1', 8000)) loop.run_until_complete(_()) server_transport.close() client_transport.close() loop.run_until_complete(_())