In short, a Directory provides a list of available services (sources of data) on the server you have connected to.
A dictionary contains the metadata required to decode the payload received from the server. By default EMA automatically requests the data dictionary behind the scenes and uses it to decode the payload.
I recommend you read through the API Concepts Guide - which is a short document that provides a great concise overview of the RT-SDK.
Real-Time-SDK/API_ConceptsGuide.pdf at master · Refinitiv/Real-Time-SDK (github.com)
You can also work through the Tutorials which provides several short tutorials explaining basic concepts through code