import asyncio class EchoServerProtocol(asyncio.Protocol): def connection_made(self, transport): self.transport = transport def data_received(self, data): self.transport.write(data) self.transport.close() async def main(): # Get a reference to the event loop as we plan to use # low-level APIs. loop = asyncio.get_running_loop() server = await loop.create_server( lambda: EchoServerProtocol(), host="", port=0, ) ports = set() for socket in server.sockets: host, port = socket.getsockname()[:2] print(f"listening on {host}:{port}") ports.add(port) assert len(ports) == 1, "Only 1 port expected!" async with server: await server.serve_forever() asyncio.run(main())